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

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;

这种"无子查询的嵌套联接"语法叫什么?在Microsoft文档中的哪里可以找到它?在joinssubqueries的上下文中没有提到它.

推荐答案

Not a derived table. Not a subquery. Not a temp table.它所做的是在逻辑上定义连接的执行顺序.它对内部联接几乎没有什么用处.Where it really comes in useful is when used with outer joins.

一个示例用例可能是"All Orders left join to Back-Order Products",但是它们之间有一个连接表.这可以编码为:

...
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

这允许在将Order-Detail和Product行提供给左连接之前对其进行组合和筛选.

括号实际上是可选的,但我更喜欢包括它们以在一定程度上提高可读性(给读者一个提示,说明发生了一些棘手的事情).

但至于"它叫什么名字?"我不认为它有名字.我认为是grouped joinsout-of-order joins.这几乎就像HP-35及其后继者时代的惠普计算器的反向波兰式记数法(RPN).

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

返回UPSERT中的旧行值

如何计算给定日期前三个月的值以及月初数据?

Oracle分层查询-两条路径在末尾合并为一条

明细表中没有记录如何更新主表的值为0

在子窗口SQL Presto中使用特定条件执行值计数

Select 最频繁的值以及分组依据

在同一列上迭代时计算持续时间

使用 XML 作为 SQL 表

在 R 值的 SQL 块中显示值

如何解释 SQL Server 中的 Foxpro 语法?

如何在 case 语句中使用聚合?

如何从一张表中获取值在至少三行相同的记录

如何将特定值从 JSON 列中的一个字段移动到 PostgreSQL 中的另一个字段?

字符串从更改到表列和查询中的一行的转换错误

SQL Select 最大并获取列名

在 postgresql 中,我可以将其组合成一个查询吗?

Athena:从字符串birth_dt列计算年龄

从不同的表中 Select 包含单词列表的记录

Amazon Redshift - 子计划的哈希表不存在