【问题标题】:Recognize correlated queries when using joins使用联接时识别相关查询
【发布时间】:2014-03-23 21:56:27
【问题描述】:

我必须在 T-SQL 中编写一些相关查询,但我是一名数据挖掘学生,所以我在这里质疑这是否是相关查询

我知道这是相关查询:

SELECT score, studentid
FROM Stats.Scores AS S1
WHERE score = (SELECT MAX(S2.score)
    FROM Stats.Scores AS S2
    WHERE S1.testid = S2.testid);
GO

但我不知道这个是否相关:

SELECT C.contactname, O.orderid
FROM Sales.Customers AS C
LEFT JOIN Sales.Orders AS O
ON C.custid IN (SELECT O.custid
    WHERE C.custid = O.custid)
ORDER BY O.orderid ASC;
GO

在我看来,相关查询的定义表明这是另一个与子查询中的 SELECT 匹配的 FROM

【问题讨论】:

    标签: sql-server tsql subquery correlation


    【解决方案1】:

    是的,第二个查询也是 correlated subquery,因为

    ON C.custid IN (SELECT O.custid
        WHERE C.custid = O.custid) <-- Here you are referring the outer table 
    

    此外,您的第二个查询将出现语法错误,导致没有from clause。您可以在两个表上进行连接以进行第二次查询(为了简化),如下所示

    SELECT C.contactname, O.orderid
    FROM Sales.Customers C
    LEFT JOIN Sales.Orders O
    ON C.custid = O.custid
    ORDER BY O.orderid ASC;
    

    定义:

    在一个简单的子查询(非相关)中,您不需要像这样引用外部表中的字段

    select col1,col2 from table1 where col1 in (select some_col from table2)
    

    在相关子查询中,您使用/引用外部查询中的字段(如您发布的示例)。

    有关相关 sybquery 的更多信息,请参阅http://en.wikipedia.org/wiki/Correlated_subquery

    【讨论】:

    • 实际上第二个查询没有返回任何语法错误:o 谢谢:)
    • 我不记得子句的执行顺序,但似乎 LEFT JOIN 消除了对下一个 FROM 子句的要求
    • 是的,不需要。它将获取查询中提到的字段,并根据连接条件向您显示结果。在您的情况下,您也可以选择inner join
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2018-07-07
    • 1970-01-01
    • 2021-09-17
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多