OUTER APPLY 和 OUTER JOIN 有啥区别,何时使用它们? [关闭]
Posted
技术标签:
【中文标题】OUTER APPLY 和 OUTER JOIN 有啥区别,何时使用它们? [关闭]【英文标题】:What is the difference between OUTER APPLY and OUTER JOIN, and when to use each? [closed]OUTER APPLY 和 OUTER JOIN 有什么区别,何时使用它们? [关闭] 【发布时间】:2019-01-29 19:45:46 【问题描述】:在 SQL Server 中,Left 和 OUTER JOIN 有什么区别?
【问题讨论】:
【参考方案1】:我本着欢迎新用户访问该网站的精神回答这个问题。
OUTER APPLY
可以实现LEFT JOIN
可以做的任何事情——甚至更多。
JOIN
是关系数据库中的原始操作。它是 SQL 的教学方式,有助于学习如何从集合的角度进行思考——JOIN
s 通常与两个集合的笛卡尔积的某个子集相关。
APPLY
实现了技术上所谓的“横向连接”。我将这些视为相关子查询的变体。本质上,这些是可以返回多于一列和多于一行的相关子查询。
我对关系数据库的理解基于JOIN
。在教 SQL 时,我会这样解释表之间的关系。
也许有一天,APPLY
(或在其他数据库中使用的LATERAL
)将成为教授 SQL 的默认方法。但是,我不认为APPLY
可以帮助人们理解基于集合的思维,所以我更喜欢先学习和使用JOIN
,然后在其他许多有用的情况下使用APPLY
。
【讨论】:
【参考方案2】:首先,我真的不知道 T-SQL 中哪个是默认的 OUTER JOIN(我敢打赌 FULL),但无论如何,我认为还不清楚 - 最好使用 LEFT、RIGHT 或 FULL需要时明确加入。
JOIN 连接表。已经存在的查询或子查询。
APPLY 在(左)表的每一行中应用(duh)一个表值函数等效项。一些有趣的案例是:
-
应用现有的实际函数:CROSS/OUTER APPLY dbo.your_function_name
您可以使用不带 FROM 的 SELECT(某些字段)来为字段创建别名 - 这会使您的代码看起来整洁
您可以使用带有 FROM 的 SELECT 来创建子查询。这和join是一样的
CROSS APPLY 是 INNER JOIN 的超集,OUTER APPLY 是 LEFT 的超集。您不能将函数应用于 nothing,就像 RIGHT 或 FULL 连接一样。
【讨论】:
啊。没有默认的outer join
(据我所知在任何数据库中)。 cross apply
和 outer apply
不等价于任何连接。它们是功能的超集。
我同意,所以我会编辑,虽然我觉得等价更简单以上是关于OUTER APPLY 和 OUTER JOIN 有啥区别,何时使用它们? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章