2 votes

SELECT * FROM t WHERE t.x OR t.y IN (SELECT id FROM z)

Est-ce que quelque chose comme ça est possible (je sais que cette déclaration ne fonctionne pas, je l'ai essayée) :

SELECT * FROM t WHERE t.x OR t.y IN (SELECT id FROM z)

Exemple

Tableau t :

|id|x  |y
|1 |101|201 
|2 |102|202

Tableau z :

|id  |
|101 | 
|201 |

Et à partir de cette table t, je veux sélectionner toutes les entrées où l'attribut x ou l'attribut y est contenu dans la liste des identifiants de la table z.

Je sais que je peux faire

SELECT * FROM t WHERE t.x IN (SELECT id FROM z) OR t.y IN (SELECT id FROM z)

mais cela semble être très inefficace lorsque la IN les valeurs proviennent d'une sous-requête complexe (qui est donc la même dans les deux cas). IN ).

Ou les implémentations actuelles du planificateur de requêtes sont-elles suffisamment intelligentes pour voir que les deux sous-requêtes donnent les mêmes résultats et ne les exécutent qu'une seule fois ? Ou peut-être existe-t-il une autre solution utilisant EXISTS que je ne vois pas actuellement ?

PS : J'utilise Postgres, mais je cherche une solution générique.

4voto

MotoGP Points 35270

Utilisez EXISTS

SELECT * FROM t WHERE exists (SELECT 1 FROM z where z.id in (t.x,t.y))

1voto

Gordon Linoff Points 213350

Si z est une requête complexe, vous pouvez alors utiliser un CTE pour simplifier le code :

WITH z AS (
      . . . 
     )
SELECT *
FROM t
WHERE t.x IN (SELECT id FROM z) OR t.y IN (SELECT id FROM z);

Vous pouvez également utiliser JOIN o EXISTS à la place :

SELECT *
FROM t
WHERE EXISTS (SELECT 1
              FROM z
              WHERE z.id IN (t.x, t.y)
             );

Le site JOIN a l'inconvénient de multiplier les rangées en raison des doublons dans les fichiers z .

Cela dit, la version avec les deux IN Les expressions sont probablement les plus efficaces.

0voto

Rushabh Master Points 311

Essayez...

SELECT t.* FROM t join z on t.x = z.id or t.y = z.id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X