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 文档中哪里可以找到它?在连接或子查询的上下文中没有提到它。
不是派生表。不是子查询。不是临时表。它的作用是在逻辑上定义连接的执行顺序。它对于内部连接几乎没有什么用处。它真正有用的地方是与外连接一起使用时。
示例用例可能是“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)。