使用in子句选择“按字段对查询”

时间:2012-05-23 18:38:51

标签: sql database db2 in-clause

我有一个名为player的表格如下:

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

我希望在这个表上写一个select语句来检索第一个id和第二个id匹配一堆指定的第一个和第二个id的所有行。

例如,我希望选择第一个和第二个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。

6 个答案:

答案 0 :(得分:30)

这适用于我的DB2(Linux / Unix / Windows上的版本9.7),使用以下语法:

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

此语法不适用于大型机上的DB2(至少在版本9.1中),因为您无法使用VALUES表达式替换子选择。此语法将起作用:

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)

答案 1 :(得分:2)

使用复合主键,我会连接两个ID并匹配复合字符串。

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

(如果id不是字符串,只需将其转换为。)

答案 2 :(得分:2)

这是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);

答案 3 :(得分:0)

此类查询适用于DB2。

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

答案 4 :(得分:0)

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

这对我来说是个奇迹。

答案 5 :(得分:0)

此语法适用于 MySQL:

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