这两个都是有效的 ISO/ANSI 完整 SQL-92 语法:
SELECT a.*
FROM Accounts a
INNER JOIN
( VALUES('0123456', '2000897'), ('0125556', '2000866')
) AS v(TaxID, AccountNumber)
ON (a.TaxID, a.AccountNumber) = (v.TaxID, v.AccountNumber)
SELECT *
FROM Accounts a
WHERE (a.TaxID, a.AccountNumber) IN
( VALUES ('0123456', '2000897'), ('0125556', '2000866') )
但我认为它们中的任何一个都不适用于任何当前的 DBMS。
这也是有效的完整 SQL-92 语法(它在 SQL-Server 2008 中不起作用,因为NATURAL JOIN
):
SELECT a.*
FROM Accounts a
NATURAL JOIN
( VALUES('0123456', '2000897'), ('0125556', '2000866')
) AS v(TaxID, AccountNumber)
这也是有效的 SQL(不确定它是否在 92 规范或更高版本中) - 并且是您所拥有的(但使用括号,而不是大括号)。
MySQL、Postgres、DB2(但不支持 SQL Server)支持它:
SELECT a.*
FROM Accounts a
WHERE (TaxID, AccountNumber) IN
( ('0123456', '2000897'), ('0125556', '2000866') )
;
DBA.SE 中有一个类似的问题,有各种其他的方法来表述这个问题:
选择两个列在集合中的位置