【问题标题】:What does this incorrect (yet valid) SQL join even mean? What is it actually doing?这个不正确(但有效)的 SQL 连接甚至意味着什么?它实际上在做什么?
【发布时间】: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


【解决方案1】:

a 到 b 的连接条件只是重复的,在 sql 中的位置无关紧要,只要在 word 后面。我相信是这样的。

您正在对此处连接 a 到 b 的结果进行 Catersian 连接。如果 a 和 b 连接产生 15 行,而 c 有 20 行,那么您的结果集是 300 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 2021-09-24
    • 2023-03-17
    • 1970-01-01
    • 2012-01-26
    • 2020-02-15
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多