SQL Full Outer Join:这些查询的区别是什么?

时间:2018-03-27 18:37:09

标签: sql azure-sql-database

假设我有一个用这些样式编写的完整外连接查询:

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)中产生不同的结果。

怎么回事?

2 个答案:

答案 0 :(得分:0)

为什么他们会返回不同的结果?因为它们是不同的查询。 FULL OUTER JOIN非常棘手。让我解释一下。

第一个查询的结果集包含来自 all 的行,两个表中的行,甚至是Table_B.iscurrent <> 1的行。如果不是这样,则相应的列将为NULL,但该行将在那里。

第二个查询的结果集将没有Table_B.iscurrent <> 1行。这些在 FULL OUTER JOIN之前被过滤掉,因此它们不在被计算的行中。

一般来说,我发现很少需要FULL OUTER JOIN。我确实使用它,但很少。通常LEFT JOINUNION 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