没有调用子查询的“嵌套 JOIN”语法是什么?

Pat*_*ski 4 sql t-sql sql-server nested join

在 SQL Server (T-SQL) 中,我当然可以 JOIN 到子查询,但我刚刚了解到我也可以 JOIN 到不是子查询的嵌套 JOIN 表达式。例如:

SELECT *
FROM dbo.Customer c
JOIN ( /* note no SELECT */
    dbo.Table2 t2 
    JOIN dbo.Table3 t3 ON t3.t2Id = t2.Id
) ON c.t2Id = t2.Id  /* note no alias */
WHERE c.CustomerId = 1234;
Run Code Online (Sandbox Code Playgroud)

这个“没有子查询的嵌套 JOIN”语法叫什么?在 Microsoft 文档中哪里可以找到它?在连接子查询的上下文中没有提到它。

T N*_*T N 7

不是派生表。不是子查询。不是临时表。它的作用是在逻辑上定义连接的执行顺序。它对于内部连接几乎没有什么用处。它真正有用的地方是与外连接一起使用时。

示例用例可能是“left join延期交货产品的所有订单”,但中间有一个联结表。这可以编码为:

...
FROM Order O
LEFT JOIN (
    OrderDetail OD
    JOIN Product P
        ON P.ProductId= OD.ProductId
        AND P.IsBackOrdered = 1 -- Not proper design, but it's just an example
    )
    ON OD.OrderId = O.OrderId
Run Code Online (Sandbox Code Playgroud)

这允许订单详细信息和产品行在馈送到 LEFT JOIN 之前进行组合和过滤。

括号实际上是可选的,但我更喜欢包含它们以在一定程度上提高可读性(向读者暗示正在发生一些棘手的事情)。

但至于“它叫什么?” 我不认为它有名字。我将其视为分组连接乱序连接。它几乎就像 HP-35 及后续产品时代 HP 计算器的逆波兰表示法 (RPN)。

  • 很好的答案,@TN。我实际上更喜欢令人困惑的 select * from customer c LEFT JOIN Order o INNER JOIN OrderDetail od ON od.id = o.od ON o.id = c.id; (2认同)