SQL逻辑:在A.FID = B.ID上将子表B加入父表A时

Dun*_*ran -1 sql sql-server

我一直想知道结果是否会在多连接表查询中发生变化.

如果您有父表A

 A          B
 ID|FID     FID
  1|2       1
  2|4       2
  3|5       3
  4|7       4
  5|8       5
  6|NULL    6
  7|NULL    7
  8|NULL    8
Run Code Online (Sandbox Code Playgroud)

你在WHERE子句中指定了哪个表列是否重要?例如,两者之间有什么区别:

Select *
From Table A
Left Join B on A.FID = B.FID
WHERE A.FID IN (2,5,8)

Select *
From Table A
Left Join B on A.FID = B.FID
WHERE B.ID IN (2,5,8)
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

编辑:迈克尔已经解决了我的问题,我已经测试了它

"实际上,虽然你的答案很好(可能是他正在寻找的那个),但由于他的两个查询基本上都是对B的主键(A.FID,B.ID)进行过滤,因此它们在逻辑上是相同的(假设A.FID是B)的真正外键约束.也就是说,两个查询都会过滤掉B.ID不是2,5或8的行. - 迈克尔L.

唯一不同的是表B是主表,并且您基于B.ID查询,如:

SELECT *
FROM B
LEFT JOIN A ON A.FID = B.FID
WHERE B.FID IN (2,5,8)
Run Code Online (Sandbox Code Playgroud)

虽然这与将A作为主表相同:

SELECT *
FROM B
LEFT JOIN A ON A.FID = B.FID
WHERE A.FID IN (2,5,8)
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

是的,它确实.

当您使用a时OUTER JOIN,其中一个表的值可能是NULL.所以,第二个查询相当于:

Select *
From Table A Inner Join 
     B
     on A.FID = B.ID
WHERE B.ID IN (2, 5, 8);
Run Code Online (Sandbox Code Playgroud)

因为这些NULL值被过滤掉了.

作为一般规则LEFT JOIN:

  • 第一个表上的过滤器属于该WHERE子句.
  • 第二个和后续表上的过滤器应该在ON子句中.