sql - 只要我们选择正确的连接类型,连接表的顺序就无关紧要吗?

标签 sql sql-server join

我们可以通过以任意顺序执行连接来实现连接表的预期结果吗?假设我们想要左连接两个表 A 和 B(顺序 AB)。通过右连接 B 和 A (BA),我们可以获得相同的结果。

3 个表 ABC 怎么样?仅仅改变顺序和连接类型就能得到什么结果吗?例如A左连接B内连接C。我们可以用BAC顺序得到它吗?如果我们有 4 张或更多 table 怎么办?

更新。 问题Does the join order matter in SQL?关于内连接类型。同意加入的顺序并不重要。该问题中提供的答案并没有回答我的问题是否可以获得使用任何原始联接类型联接表的所需结果 (join types here)通过选择我们喜欢的表的任意顺序,并且仅通过操作连接类型来实现此目标。

最佳答案

在内连接中,连接中表的顺序并不重要 - 相同的行将构成结果集,无论它们在连接语句中的顺序如何。

无论是左外连接还是右外连接,顺序都很重要。在 A 左连接 B 中,无论表 B 中是否有匹配行,结果集都将为表 A 中的每条记录包含一行。如果存在不匹配的行,则这可能是与 B 不同的结果集左连接 A。

在完全外连接中,顺序并不重要 - 每个连接表中的每一行都会生成行,无论它们的顺序如何。

关于 A 左连接 B 与 B 右连接 A - 这些将产生相同的结果。在具有 2 个表的简单情况下,交换表并更改外连接的方向将产生相同的结果集。

如果所有外连接都在同一方向,这也适用于 3 个或更多表 - A 左连接 B 左连接 C 将提供与 C 右连接 B 右连接 A 相同的结果集。

如果您开始混合左右连接,那么您将需要开始更加小心。几乎总是有一种方法可以使用重新排序的表进行等效查询,但此时子查询或括号表达式可能是澄清您正在做的事情的最佳方法。

正如另一位评论者所说,使用任何能让你的目的最明确的东西通常是最好的选择。查询中表的顺序应该对性能影响很小或没有影响,因为查询优化器应该解决这个问题(尽管确保这一点的唯一方法是使用您自己的查询检查每个选项的执行计划)数据)。

关于sql - 只要我们选择正确的连接类型,连接表的顺序就无关紧要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760539/

相关文章:

c# - 执行插入更新命令时从 SQL Server 搜索数据时出现超时问题

mysql - 使sql View 可编辑

php - 使用 MySql 查看我 friend 的共同好友

sql - SQL Server中如何在两列中显示一列值

python - 根据查找数据框计算距离

sql - 如何在具有不同分隔符的HIVE中处理SPLIT功能

MySQL Group By 并跳过空值分组

sql - 在 Informix 的存储过程中传递参数 null

sql - 是否有可能在同一触发器运行中混合更新和插入?

SQL Server 根据不同标志计算累积和/条件运行总计