From: | "Daniel Verite" <daniel(at)manitou-mail(dot)org> |
---|---|
To: | "Samuel ROZE" <samuel(dot)roze(at)aliceadsl(dot)fr> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Une recherche sur plusieurs lignes ? |
Date: | 2009-08-19 12:14:43 |
Message-ID: | ac93a111-57b0-4e91-bf26-96737d9ce424@mm |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Samuel ROZE wrote:
> 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)
Tu pourrais faire N requêtes simples liées entre elles par un INTERSECT, du
style:
SELECT cid FROM cv JOIN ck ON ck.id=cv.key WHERE name='clef1' AND
value='val1'
INTERSECT
SELECT cid FROM cv JOIN ck ON ck.id=cv.key WHERE name='clef2' and
value='val2'
INTERSECT
SELECT cid FROM cv JOIN ck ON ck.id=cv.key WHERE name='clef3' and
value='val3'
etc...
où cid est l'id de contexte et cv et ck sont context_values et context_keys
(je raccourcis).
A mon avis ça fonctionnera bien mais ça reste du SQL généré. Impossible d'en
faire une vue par exemple.
Maintenant si l'objectif était d'avoir du SQL fixe ça doit être faisable en
utilisant les tableaux, si les (clef,valeur) arrivent en tableau de valeurs
de type couple.
Il faudrait créer un type couple:
CREATE TYPE couple AS (keyname text, value text);
Ensuite Il faudrait, dans une sous-requête, sortir chaque id de contexte et
un tableau de tous les couples qui lui correspondent, du genre:
SELECT id,
ARRAY(select (name,value)::couple
from cv JOIN ck ON ck.id=cv.key WHERE cid=c.id) AS arr
FROM (select id FROM context_list) c
GROUP BY id
Ensuite ne garder que les id pour lesquels le tableau en entrée est contenu
dans le tableau de tous les couples de cet id, grâce au prédicat:
tableau_contenu <@ tableau_contenant
Ca donnerait:
SELECT cid FROM
(requête du dessus) s
WHERE ARRAY[('clef1','val1')::couple, ('clef2','val2')::couple] <@ arr;
Il me semble que ça répond au problème. Au niveau des performances par
contre, s'il y a beaucoup de couples dans la base, ça peut être lent. Il
devrait être possible d'optimiser en commençant à filtrer les clefs dès la
sous-requête, mais il faut s'assurer que la version de base fonctionne avant
d'optimiser.
Cordialement,
--
Daniel
From | Date | Subject | |
---|---|---|---|
Next Message | Daniel Verite | 2009-08-19 12:39:48 | Re: Une recherche sur plusieurs lignes ? |
Previous Message | georges.simon | 2009-08-19 12:00:34 | Re: Une recherche sur plusieurs lignes ? |