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

ua4mk5z4  于 2022-11-07  发布在  DB2
关注(0)|答案(7)|浏览(504)

我有一个表叫球员如下:

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相匹配的所有行。
例如,我希望选择第一个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。

ef1yzkbh

ef1yzkbh1#

在我的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)
57hvy0tb

57hvy0tb2#

下面是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);
myzjeezk

myzjeezk3#

对于复合主键,我将连接两个id并匹配复合字符串。

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

(If id不是字符串,只需将它们转换为字符串即可。)

cmssoen2

cmssoen24#

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

这对我来说是个奇迹。

xdnvmnnf

xdnvmnnf5#

此语法适用于MySQL:

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

mw3dktmi6#

这种类型的查询在DB2中有效。

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

kxxlusnw7#

如果需要按以下顺序提供数据:
| 第一个ID(_I)|第二个标识|名称名称名称|
| - -|- -|- -|
| 一个|一个|杜兰特|
| 一个|2个|勒布朗|
| 一个|三个|迪尔克|
| 2个|一个|科比|
| 2个|2个|德怀特|
那么简单易行的方法就是:
从按First_id、second_id排序的播放器中选择 *;
如果任何列需要任何条件,则可以使用“where”子句。

相关问题