gpt4 book ai didi

sql - 在 SQL 中,Join 后面的 ON 条件与多个 JOINS 末尾的 ON 条件有什么区别

转载 作者:行者123 更新时间:2023-12-02 10:06:41 35 4
gpt4 key购买 nike

我一直很难在谷歌上搜索这个问题的答案,但是......有人可以向我解释一下将 JOIN 的 ON 条件与 JOIN 本身放在一起与将 ON 放在所有其他 JOIN 的末尾之间的区别吗?

这是一个例子http://sqlfiddle.com/#!3/e0a0f/3

CREATE TABLE TableA (Email VARCHAR(100), SomeNameA VARCHAR(100))
CREATE TABLE Tableb (Email VARCHAR(100), SomeNameB VARCHAR(100))
CREATE TABLE Tablec (Email VARCHAR(100), SomeNameC VARCHAR(100))

INSERT INTO TableA SELECT 'joe@test.com', 'JoeA'
INSERT INTO TableA SELECT 'jan@test.com', 'JaneA'
INSERT INTO TableA SELECT 'dave@test.com', 'DaveA'
INSERT INTO TableB SELECT 'joe@test.com', 'JoeB'
INSERT INTO TableB SELECT 'dave@test.com', 'DaveB'
INSERT INTO TableC SELECT 'joe@test.com', 'JoeC'
INSERT INTO TableC SELECT 'dave@test.com', 'DaveC'


SELECT TOP 2 a.*,
b.*,
c.*
FROM TableA a
LEFT OUTER JOIN TableB b
ON a.email = b.email
INNER JOIN TableC c
ON c.Email = b.email;

SELECT TOP 2 a.*,
b.*,
c.*
FROM TableA a
LEFT OUTER JOIN TableB b
INNER JOIN TableC c
ON c.Email = b.email
ON a.email = b.email;

我不明白为什么这两个 SELECT 语句会产生不同的结果。

最佳答案

重要的是连接的顺序。将您的表达式视为每个连接都生成临时“虚拟”表。

所以当你写

FROM TableA a 
LEFT OUTER JOIN TableB b ON a.email = b.email
INNER JOIN TableC c ON c.Email = b.email ;

那么顺序如下:

  1. TableA 左连接到 TableB,生成临时关系 V1
  2. V1 内部连接到 TableC

当你写的时候:

FROM TableA a 
LEFT OUTER JOIN TableB b
INNER JOIN TableC c ON c.Email = b.email ON a.email = b.email;

那么顺序如下:

  1. TableB 内部连接到 TableC,生成临时关系 V1
  2. TableA 左连接到 V1

因此结果不同。通常建议在这种情况下使用括号以提高查询的可读性:

FROM TableA a 
LEFT OUTER JOIN
(TableB b INNER JOIN TableC c ON c.Email = b.email)
ON a.email = b.email;

关于sql - 在 SQL 中,Join 后面的 ON 条件与多个 JOINS 末尾的 ON 条件有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12195382/

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