web-dev-qa-db-ja.com

in句を使用してフィールドのペアでクエリを選択する

次のようなプレイヤーと呼ばれるテーブルがあります。

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

このテーブルにselectステートメントを記述して、最初のIDと2番目のIDが指定された最初と2番目のIDの束に一致するすべての行を取得したいと思います。

したがって、たとえば、最初と2番目のIDが(1,1)、(1,2)、および(1,3)であるすべての行を選択したいとします。これにより、次の3行が取得されます。

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

次のような方法で選択クエリを書くことは可能ですか?

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

上記のようなSQLを作成する方法があれば、知りたいと思います。図のように複数の行を表すIN句の値を指定する方法はありますか。

DB2を使用しています。

27
user1412952

これは、次の構文を使用して、DB2(Linux/Unix/Windows上のバージョン9.7)で機能します。

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

この構文は、サブフレームをVALUES式で置き換えることができないため、メインフレーム上のDB2では機能しません(少なくともバージョン9.1では)。この構文は機能します:

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)
30
bhamby

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);
2
Dom T.

複合主キーでは、2つのIDを連結し、複合文字列に一致します。

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

(IDが文字列ではない場合、単にそのようにキャストします。)

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

これは私にとって不思議に働いた。

0
Merkurial

このタイプのクエリはDB2で機能します。

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