2

在某些 SQL 方言中,您可以声明(例如):

SELECT * FROM SomeTable WHERE (val1,val2) IN 
  (SELECT val1,val2 FROM SomeOtherTable)

但我不知道如何在我使用的 TSQL (sql server 2k) 中做到这一点。

我知道(并且现在正在使用)解决方法,例如使用连接或连接值,但是 TSQL 中是否有一些语法我忽略了这样做?

更新:这是有效的 SQL-99 语法,这就是为什么我认为 join 是一种解决方法,即使它会更高效。我的问题可能会更好:

TSQL 中是否有这种语法的实现?

UPDATE2:我刚刚测试了这个语法 om Mysql,它在那里工作得很好。

4

5 回答 5

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

答案是否定的

正如文件所说:

subquery具有列的结果集。此列必须具有与 相同的数据类型test_expression

于 2009-06-05T12:55:25.533 回答
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
于 2009-06-05T12:54:50.777 回答
1

加入将是去这里的方式。

于 2009-06-05T12:51:53.153 回答
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)

查看它的文档。由于有一个依赖于每一行的 where 子句(例如,WHERE SomeOtherTable.ID = SomeTable.MyOtherID),它会提高性能,并且连接绝对是要走的路。

于 2009-06-05T12:52:46.600 回答
0
Select SomeTable.*
FROM SomeTable, SomeOtherTable
WHERE SomeTable.Val1 = SomeOtherTable.Val1
    And SomeTable.Val2 = SoemeOtherTable.Val2

您不应将此视为“解决方法”。这是完成您想要完成的事情的最基本和标准的方式。

编辑:这可能不是您的标准“JOIN”语法,但这是一种习惯。

于 2009-06-05T12:56:47.670 回答