这个不正确(但有效)的SQL连接甚至意味着什么?它究竟在做什么?
问题描述:
考虑下面的SQL语句这个不正确(但有效)的SQL连接甚至意味着什么?它究竟在做什么?
select *
from A
inner join B on A.FK = B.PK
inner join C on A.FK = B.PK
这显然是不正确形成陈述。 C的连接使用B的连接条件。但是,这仍然运行。在这种情况下,口译员如何决定加入C?为什么这甚至是被允许的陈述?有没有任何情况下,像这样的东西是可取的?
答
从a到b的连接条件是重复的,只要在关键字后面,它在sql中的位置并不重要。我相信这是事实。
你正在做一个caterian加入到这里加入a的结果。如果a和b连接产生15行,并且c有20,那么结果集为300行。
它是否返回“正确”的数据?对我而言,开发人员看起来像是印刷错误,从不重新验证输出。 – Amit
@Amit - 这不是一个关于具体情况的问题。我想到了这个问题,因为事实上我做了一个复制粘贴错误的事情,我正在努力并纠正它。但是,我注意到SQL语句仍然运行(很长一段时间),我杀了它。问题是“它究竟在做什么,它为什么被允许,并且它是否可取?”。 –
优化器可随意*裁剪条件。所以这将相当于两个条件(一个是真的)在WHERE部分。至于“它在做什么” - 笛卡尔产品就是它正在做的事情。 –