假设我有一个用这些样式编写的完整外连接查询:
SELECT * FROM Table_A
FULL OUTER JOIN Table_B ON (Table_A.Col1 = Table_B.Col1 AND Table_B.iscurrent=1)
对战
SELECT * FROM Table_A
FULL OUTER JOIN (Select * FROM Table_B Where iscurrent=1) AS Table_B
ON (Table_A.Col1 = Table_B.Col1)
两者都在我的数据库(Azure SQL DB)中产生不同的结果。
怎么回事?
答案 0 :(得分:0)
为什么他们会返回不同的结果?因为它们是不同的查询。 FULL OUTER JOIN
非常棘手。让我解释一下。
第一个查询的结果集包含来自 all 的行,两个表中的行,甚至是Table_B.iscurrent <> 1
的行。如果不是这样,则相应的列将为NULL
,但该行将在那里。
第二个查询的结果集将没有Table_B.iscurrent <> 1
行。这些在 FULL OUTER JOIN
之前被过滤掉,因此它们不在被计算的行中。
一般来说,我发现很少需要FULL OUTER JOIN
。我确实使用它,但很少。通常LEFT JOIN
或UNION ALL
执行我真正想要的操作。
答案 1 :(得分:0)
包含Where Table_B.iscurrent = 1的第二行。
在第一个中你拥有Table_B中的所有行,但如果是iscurrent&lt;&gt;它们就不会连接到Table_A 1。
SELECT *
FROM Table_A
FULL OUTER JOIN Table_B
ON Table_A.Col1 = Table_B.Col1
AND Table_B.iscurrent = 1
SELECT *
FROM Table_A
FULL OUTER JOIN ( Select *
FROM Table_B
Where iscurrent = 1
) AS Table_B
ON Table_A.Col1 = Table_B.Col1