2017-06-30 3 views
3

J'essaie d'optimiser ma requête SQL, de sorte que nous n'aurons pas à traiter la réponse sur notre JVM.Requête SQL similaire à IN où clause avec la condition ET au lieu de OU

Considérons que nous avons tableau ci-dessous avec des entrées:

+-----------+-------------+ 
| Column1 | Column2  | 
+-----------+-------------+ 
|val11  |val21  | 
|val11  |val22  | 
|val11  |val23  | 
|val12  |val21  | 
|val12  |val24  | 
+-----------+-------------+ 

Maintenant, je veux exécuter une requête qui me column1s résultat ayant des lignes mappées aux valeurs Column2s val21, Val22, val23. Quelque chose de similaire à la clause IN where, mais comme la clause IN where recherche des données avec OU entre les valeurs de la clause IN, je veux rechercher ET entre ces valeurs.

Pour IN clause where:

SELECT Column1 from table 
WHERE Column2 IN (val21, val22, val23) 

entraînera à la fois val11 et Val12 (comme clause IN vérifiera les données avec val21, ou Val22 ou val23). Au lieu de cela, je veux avoir une requête qui va vérifier que Column1 a un mapping avec les trois val21, val22, val23 comme nous l'avons pour val11.

Utilisation de Informix DB.

+0

Utilisation d'Informix DB. –

+2

[Divided We Stand: Le SQL de la Division Relationnelle] (https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) – GarethD

Répondre

6

Ceci est appelé "division relationnelle".

L'approche habituelle pour cela, est quelque chose comme ce qui suit:

select column1 
from x 
where column2 in ('val21', 'val22', 'val23') 
group by column1 
having count(distinct column2) = 3; 

Notez que ceci inclurait également des valeurs qui ont plus de ces trois valeurs attribuées dans column2 (il retourne ceux qui ont au moins ces trois valeurs)

+0

Merci @a_horse_with_no_name, ça a marché. –

0

Vous pouvez également le faire mais s'il vous plaît noter qu'il renverra les cas où column2 a moins d'enregistrements que le tableau suivant IN. Avec cette technique, vous vous assurez que toutes les valeurs de column2 ont une correspondance dans le tableau, pour le groupe column1 donné. Assurez-vous de gérer les valeurs NULL de manière appropriée.

SELECT column1 
FROM t 
WHERE t.column2 IN (11,21) 
AND NOT EXISTS (SELECT 1 
     FROM t t1 
     WHERE t1.column2 NOT IN (11,21) 
     AND t1.column1 = t.column1) 
+0

Il n'est pas clair pourquoi vous utilisez les valeurs 11 et 21 lorsque des valeurs spécifiques sont listées dans la question. –