我有一张名为 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。
这适用于我的 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)
下面是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);
使用复合主键,我会连接两个 id 并匹配复合字符串。
select id1 + id2 as FullKey, *
from players
where FullKey in ('11','12','13')
(如果 id 不是字符串,只需将它们强制转换为字符串即可。
此语法适用于 MySQL:
SELECT *
FROM PLAYERS
WHERE (First_Id, Second_Id) IN ((1,1), (1,2), (1,3))
SELECT * FROM <your table> where (<field1>, <field2>, ...) in (SELECT <field1>, <field2>, ... FROM <your table> where <your condition>)
这对我来说是奇迹。
查询在 DB2 中工作。
SELECT * FROM A
WHERE (C1, C2) IN (SELECT B1, B2 FROM B WHERE B3=1);
如果需要数据,请按以下顺序排列:
First_Id<样式>Second_Id<样式>名称样式>样式> | ||
---|---|---|
1 | 1 | 杜兰特 |
1 | 2 | 勒布朗 |
1 | 3 | Dirk |
2 | 1 | Kobe |
2 | 2 | Dwight |