Re: Une recherche sur plusieurs lignes ?

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

In response to

Browse pgsql-fr-generale by date

  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 ?