【发布时间】:2017-10-15 05:39:32
【问题描述】:
考虑下面的 SQL 语句
select *
from A
inner join B on A.FK = B.PK
inner join C on A.FK = B.PK
这显然是一个格式错误的陈述。 C 的连接使用 B 的连接条件。但是,这仍然运行。在这种情况下,解释器是如何决定加入 C 的?为什么这甚至是允许的声明?在任何情况下都需要这样的事情吗?
【问题讨论】:
-
它是否返回
correct数据?在我看来,开发人员似乎犯了一个印刷错误并且从未重新验证输出。 -
@Amit - 这不是关于特定情况的问题。我想到了这个问题,因为事实上我确实在我正在处理的事情上犯了一个复制粘贴错误并纠正了它。但是,我注意到 SQL 语句仍然运行(很长时间)并且我将其杀死。问题是“它实际上在做什么,为什么允许它,它曾经是可取的吗?”。
-
优化器可以随意重新排列条件。所以这相当于两个条件(一个真的)都在 WHERE 部分。至于“它在做什么”——笛卡尔积就是它在做什么。
-
@SergioTulentsev - 所以你是说整个表 C 将为 AB 的每一行连接?这可以解释为什么它运行了这么长时间。
-
@ChechyLevas:是的,这正是会发生的事情。
标签: sql join syntax interpreter