在某些SQL方言中,您可以声明(某些内容):
SELECT * FROM SomeTable WHERE (val1,val2) IN
(SELECT val1,val2 FROM SomeOtherTable)
但我不知道如何在我使用的TSQL(sql server 2k)中这样做。
我知道(现在使用)解决方法,比如使用连接或连接值, 但在TSQL中是否有一些语法我忽视了这一点?
更新:这是有效的SQL-99语法,这就是为什么我认为连接是一种解决方法,即使它会更高效。我的问题可能更好:
在TSQL中是否有这种语法的实现?
UPDATE2:我刚用Mysql测试了这个语法,它在那里工作正常。
答案 0 :(得分:10)
SELECT *
FROM SomeTable st
WHERE EXISTS
(
SELECT 1
FROM SomeOtherTable sot
WHERE sot.val1 = st.val1
AND sot.val2 = st.val2
)
这实际上是IN
构造针对任何SEMI JOIN
方法进行优化的原因。
关于你的问题,
T-SQL
中是否有这种语法的实现?
答案是否
正如documentation所说:
...
subquery
,其结果集为一个列。此列必须与test_expression
具有相同的数据类型。
答案 1 :(得分:4)
没有该语法的sql server实现。你必须做这样的事情:
SELECT st.*
FROM SomeTable st
INNER JOIN
(
SELECT val1, val2
FROM SomeOtherTable
GROUP BY val1, val2
) sot ON sot.val1= st.val1 AND sot.val2 = st.val2
答案 2 :(得分:1)
加入将是这里的方式。
答案 3 :(得分:0)
IN仅适用于单列数组。既然您明确声明要执行IN子句:
SELECT * FROM SomeTable
WHERE val1 IN (SELECT val1 FROM SomeOtherTable WHERE val2 = SomeTable.val2)
AND val2 IN (SELECT val2 FROM SomeOtherTable WHERE val1 = SomeTable.val1)
查看documentation。因为有一个依赖于每一行的where子句(例如-WHER SomeOtherTable.ID = SomeTable.MyOtherID),它将会影响性能,并且连接绝对是可行的方法。
答案 4 :(得分:0)
Select SomeTable.*
FROM SomeTable, SomeOtherTable
WHERE SomeTable.Val1 = SomeOtherTable.Val1
And SomeTable.Val2 = SoemeOtherTable.Val2
您不应该将此视为“解决方法”。这是完成你想要完成的事情的最基本和最标准的方法。
编辑:它可能不是您标准的“JOIN”语法,但这是一种习惯。