From: | Guillaume Lelarge <guillaume(at)lelarge(dot)info> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Cc: | Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr> |
Subject: | Re: Une recherche sur plusieurs lignes ? |
Date: | 2009-08-19 06:39:17 |
Message-ID: | 200908190839.17749.guillaume@lelarge.info |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
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.
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
From | Date | Subject | |
---|---|---|---|
Next Message | Samuel ROZE | 2009-08-19 09:31:55 | Re: Une recherche sur plusieurs lignes ? |
Previous Message | Cédric Villemain | 2009-08-19 00:13:16 | Re: Une recherche sur plusieurs lignes ? |