web-dev-qa-db-fra.com

Sélectionnez Requête par paire de champs à l'aide d'une clause in

J'ai une table appelée joueurs comme suit:

First_Id    Second_Id     Name
1           1             Durant
2           1             Kobe
1           2             Lebron
2           2             Dwight
1           3             Dirk

Je souhaite écrire une instruction select sur cette table pour extraire toutes les lignes dont les premier et deuxième identifiants correspondent à un groupe de premier et deuxième identifiants spécifiés.

Ainsi, par exemple, je souhaite sélectionner toutes les lignes dont les premier et deuxième ID sont les suivants: (1,1), (1,2) et (1,3). Cela permettrait de récupérer les 3 lignes suivantes:

First_Id    Second_Id    Name
1           1            Durant
1           2            Lebron
1           3            Dirk

Est-il possible d'écrire une requête de sélection de la manière suivante:

SELECT * 
FROM PLAYERS
WHERE (First_Id, Second_Id) IN ((1,1), (1,2) and (1,3))?

S'il y a un moyen d'écrire le code SQL similaire à ce qui précède, j'aimerais savoir. Existe-t-il un moyen de spécifier des valeurs pour une clause IN qui représente plusieurs lignes, comme illustré.

J'utilise DB2.

23
user1412952

Cela fonctionne sur mon DB2 (version 9.7 sur Linux/Unix/Windows) en utilisant cette syntaxe:

SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN (VALUES (1,1), (1,2), (1,3))

Cette syntaxe ne fonctionnera pas sur DB2 sur le grand système (du moins dans la version 9.1), car vous ne pouvez pas remplacer une sous-sélection par une expression VALUES. Cette syntaxe fonctionnera:

SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN (SELECT 1, 1 FROM SYSIBM.SYSDUMMY1 UNION ALL
                                SELECT 1, 2 FROM SYSIBM.SYSDUMMY1 UNION ALL
                                SELECT 1, 3 FROM SYSIBM.SYSDUMMY1)
28
bhamby

Avec les clés primaires composées, je concaténerais les deux identifiants et ferais correspondre les chaînes composées.

select id1 + id2 as FullKey, *
from players
where FullKey in ('11','12','13')

(Si les identifiants ne sont pas des chaînes, il suffit de les lancer comme tels.)

2
SQLCurious
SELECT * FROM <your table> where (<field1>, <field2>, ...) in (SELECT <field1>, <field2>, ... FROM <your table> where <your condition>)

Cela a fonctionné à merveille pour moi.

0
Merkurial

Ce type de requête fonctionne dans DB2.

SELECT * FROM A
WHERE (C1, C2) IN (SELECT B1, B2 FROM B WHERE B3=1);
0
user4235208

Voici une solution très similaire dans postgresql:

SELECT tmp_table.val1, tmp_table.val2
FROM tmp_table
WHERE (tmp_table.val1, tmp_table.val2) not in (select tmp_table2.val1, tmp_table2.val2 from tmp_table2);
0
Dom T.