35

次のように、players というテーブルがあります。

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

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

たとえば、最初と 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を使用しています。

4

6 に答える 6

40

これは、次の構文を使用して、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)
于 2012-05-23T18:45:14.650 に答える
5

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);
于 2012-06-05T16:05:02.637 に答える
2

複合主キーを使用して、2 つの ID を連結し、複合文字列に一致させます。

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

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

于 2012-05-23T19:08:27.773 に答える
0

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

SELECT * FROM A
WHERE (C1, C2) IN (SELECT B1, B2 FROM B WHERE B3=1);
于 2016-01-13T17:18:51.900 に答える