Skip site navigation (1) Skip section navigation (2)

Re: Une recherche sur plusieurs lignes ?

From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Une recherche sur plusieurs lignes ?
Date: 2009-08-19 09:39:16
Message-ID: 1250674756.32738.61.camel@samuel-laptop (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour,

Tout d'abord merci de vous pencher sur mon problème. C'est intéressant,
seulement, dans mon exemple il y a deux couples clé/valeur à rechercher.
Or il se peut que j'en ai un ou cinq...ou dix.. (très très rare mais
quand même)

Merci !

Le mercredi 19 août 2009 à 08:39 +0200, Guillaume Lelarge a écrit :
> Le mercredi 19 août 2009 à 00:52:51, Samuel ROZE a écrit :
> > Bonjour,
> >
> > En concordance avec mon exemple précédent, voici les trois tables avec
> > quelques enregistrements:
> >
> > CREATE TABLE context_keys (
> >   id SERIAL,
> >   name text NOT NULL
> > );
> > INSERT INTO context_keys (id, name) VALUES
> > (1, 'label1'),
> > (2, 'label2');
> >
> >
> > CREATE TABLE context_list (
> >   id SERIAL
> > );
> > INSERT INTO context_list (id) VALUES
> > (1),
> > (2);
> >
> >
> > CREATE TABLE context_values (
> >   context integer NOT NULL,
> >   key integer NOT NULL,
> >   value text NOT NULL
> > );
> > INSERT INTO context_values (context, key, value) VALUES
> > (1, 1, 'somethink'),
> > (1, 2, 'value2'),
> > (2, 1, 'value3'),
> > (2, 2, 'value4');
> >
> >
> > Je veux avoir l'ID du context (clé "id" de la table "context_list") qui
> > a la clé "label1" = 'value3' ET "label2" = 'value4'. C'est l'ID #2. Mais
> > comment avoir ce résultat en une seule requête.. Bonne question :-)
> >
> 
> Ceci est la première chose qui me vient en tête:
> 
> select cv1.context
> from context_values as cv1, context_values as cv2
> where cv1.key in (select id from context_keys where name='label1')
>         and cv1.value='value3'
>   and cv2.key in (select id from context_keys where name='label2')
>         and cv2.value='value4'
>   and cv1.context=cv2.context;
> 
> À noter qu'en 8.4, on ferait plutôt ça:
> 
> with
>   ck1 as (select id from context_keys where name='label1'),
>   ck2 as (select id from context_keys where name='label2')
> select cv1.context
> from context_values as cv1, context_values as cv2, ck1, ck2
> where cv1.key=ck1.id and cv1.value='value3'
>   and cv2.key=ck2.id and cv2.value='value4'
>   and cv1.context=cv2.context;
> 
> ce qui n'est que deux fois plus rapide.
> 
> Ce qui me fait penser que ceci est une version améliorée de la première:
> 
> select cv1.context
> from context_values as cv1, context_values as cv2,
>      context_keys as ck1, context_keys as ck2
> where cv1.key=ck1.id and cv1.value='value3'
>   and cv2.key=ck2.id and cv2.value='value4'
>   and cv1.context=cv2.context
>   and ck1.name='label1'
>   and ck2.name='label2';
> 
> Même perfs que la requête CTE.
> 
> 


In response to

Responses

pgsql-fr-generale by date

Next:From: Ludovic LevesqueDate: 2009-08-19 10:03:51
Subject: Re: Une recherche sur plusieurs lignes ?
Previous:From: Samuel ROZEDate: 2009-08-19 09:31:55
Subject: Re: Une recherche sur plusieurs lignes ?

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group