gpt4 book ai didi

sql - 左外连接是关联的吗?

转载 作者:行者123 更新时间:2023-12-03 10:53:45 24 4
gpt4 key购买 nike

很容易理解为什么左外连接不是可交换的,但是我在理解它们是否关联时遇到了一些麻烦。一些在线资源表明他们不是,但我还没有说服自己这是事实。

假设我们有三个表:A、B 和 C。

设A包含两列,ID和B_ID,其中ID是表A的主键,B_ID是表B的主键对应的外键。

设B包含两列,ID和C_ID,其中ID是表B的主键,C_ID是表C的主键对应的外键。

让 C 包含两列 ID 和 VALUE,其中 ID 是表 C 的主键,而 VALUE 仅包含一些任意值。

那么不应该(A left outer join B) left outer join C等于 A left outer join (B left outer join C) ?

最佳答案

如果您假设您在外键上加入,正如您的问题似乎暗示的那样,那么是的,我认为 OUTER JOIN 保证是关联的,如 Przemyslaw Kruglej's answer 所述。 .

但是,鉴于您实际上还没有指定 JOIN 条件,迂腐的正确答案是不,它们不能保证是关联的。有两种简单的方法可以违反反常的关联性 ON条款。

1. JOIN 条件之一涉及所有 3 个表的列

这是违反关联性的一种非常便宜的方法,但严格来说,您的问题中没有任何内容禁止它。使用问题中建议的列名称,考虑以下两个查询:

-- This is legal
SELECT * FROM (A JOIN B ON A.b_id = B.id)
JOIN C ON (A.id = B.id) AND (B.id = C.id)


-- This is not legal
SELECT * FROM A
JOIN (B JOIN C ON (A.id = B.id) AND (B.id = C.id))
ON A.b_id = B.id

底部查询甚至不是有效查询,但顶部查询是。显然,这违反了结合性。

2.尽管一张表中的所有字段都为NULL,但可以满足JOIN条件之一

这样,我们甚至可以根据 JOIN 的顺序在结果集中有不同数量的行。例如,设在 B 上加入 A 的条件是 A.b_id = B.id ,但在 C 上加入 B 的条件是 B.id IS NULL .

因此我们得到这两个查询,输出非常不同:
SELECT * FROM (A LEFT OUTER JOIN B ON A.b_id = B.id) 
LEFT OUTER JOIN C ON B.id IS NULL;


SELECT * FROM A
LEFT OUTER JOIN (B LEFT OUTER JOIN C ON B.id IS NULL)
ON A.b_id = B.id;

你可以在这里看到这个: http://sqlfiddle.com/#!9/d59139/1

关于sql - 左外连接是关联的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20022196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com