SQL中是否有这种查询语法的实现?

时间:2009-06-05 12:49:16

标签: sql-server tsql subquery

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

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

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

我知道(现在使用)解决方法,比如使用连接或连接值, 但在TSQL中是否有一些语法我忽视了这一点?

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

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

UPDATE2:我刚用Mysql测试了这个语法,它在那里工作正常。

5 个答案:

答案 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”语法,但这是一种习惯。