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

use*_*952 27 sql database db2 in-clause

我有一个叫做玩家的桌子如下:

First_Id    Second_Id     Name
1           1             Durant
2           1             Kobe
1           2             Lebron
2           2             Dwight
1           3             Dirk
Run Code Online (Sandbox Code Playgroud)

我希望在这个表上写一个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
Run Code Online (Sandbox Code Playgroud)

是否可以以下列方式编写选择查询:

SELECT * 
FROM PLAYERS
WHERE (First_Id, Second_Id) IN ((1,1), (1,2) and (1,3))?
Run Code Online (Sandbox Code Playgroud)

如果有一种方法可以编写类似于上面的SQL我想知道.有没有办法为IN子句指定表示多行的值,如图所示.

我正在使用DB2.

bha*_*mby 30

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

SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN (VALUES (1,1), (1,2), (1,3))
Run Code Online (Sandbox Code Playgroud)

此语法不适用于大型机上的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)
Run Code Online (Sandbox Code Playgroud)

  • @GordonLinoff我同意,但他确实说他正在使用DB2.:) (3认同)
  • 第一种语法(`WHERE(f,s IN IN(VALUES(1,1),(1,2))`))也可以在PostgreSQL中使用,在docs中它表示这是一种标准SQL:https:// www.postgresql.org/docs/current/static/sql-values.html (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)