我已经阅读了20多个标题相似的帖子,但没有找到答案,所以如果有一个帖子,请提前道歉。
我一直相信
select * FROM A LEFT JOIN B on ON A.ID = B.ID
等于
select * FROM A LEFT JOIN B on ON B.ID = A.ID
但是今天被告知:“由于您有一个左连接,因此必须将其设置为A = B,因为将其翻转将充当内部连接。
对此有何道理?
答案 0 :(得分:5)
谁告诉您不了解JOIN和联接条件如何工作。他/她是完全错误的。
表的顺序对于左联接很重要。 a left join b
与b left join a
不同,但是联接 condition 的顺序没有意义。
答案 1 :(得分:3)
A.ID = B.ID
是连接表并返回TRUE
或FALSE
的条件。
由于equity(=
)为commutative,因此操作数的顺序不会影响结果。
答案 2 :(得分:1)
它们是完全不正确的,很难证明。
DECLARE @A TABLE (ID INT)
DECLARE @B TABLE (ID INT)
INSERT INTO @A(ID) SELECT 1
INSERT INTO @A(ID) SELECT 2
INSERT INTO @B(ID) SELECT 1
SELECT *
FROM @A a
LEFT JOIN @B b ON a.ID=b.ID
SELECT *
FROM @A a
LEFT JOIN @B b ON b.ID=a.ID
表的顺序很重要(A左连接B与B左连接A),如果使用OR,则连接条件组的顺序很重要(A = B OR A IS NULL和A IS NOT NULL-始终使用用OR括起来,但在条件组内(例如a.ID = b.ID)没关系。