为什么我在FULL OUTER JOIN的匹配列上得到空白值?

时间:2016-11-22 01:11:41

标签: sql outer-join

我有两张桌子,我试图将它们组合在一起。为简单起见,它们各有两列:表中通用的ID,以及不同的数值。但是,并非所有ID都存在于两个表中,因此我使用了FULL OUTER JOIN。

 Table1               Table2
+------+--------+    +------+--------+
| ID   | Value1 |    | ID   | Value2 |
+------+--------+    +------+--------+
| ABC  | 125    |    | ABC  | 317    |
| DEF  | 13     |    | HIJ  | 95     |
+------+--------+    +------+--------+

我希望OUTER JOIN会给我所有记录:

+------+--------+--------+
| ID   | Value1 | Value2 |
+------+--------+--------+
| ABC  | 125    | 317    |
| DEF  | 13     |        |
| HIJ  |        | 95     |
+------+--------+--------+

但我所看到的是,如果在表1中不存在ID,则ID不会被复制到合并后的结果中:

+------+--------+--------+
| ID   | Value1 | Value2 |
+------+--------+--------+
| ABC  | 125    | 317    |
| DEF  | 13     |        |
|      |        | 95     |
+------+--------+--------+

为什么我的ID是空白的?我的查询如下:

SELECT ID, Value1, Value2
FROM Table1
FULL OUTER JOIN Table2 ON Table1.ID == Table2.ID;

我使用的是最接近SQL Server的公司内部语言。虽然存在一些差异,但我想我会首先检查我对连接语法的理解。

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT
    COALESCE( Table1.ID, Table2.ID ) AS [ID],
    Table1.Value1,
    Table2.Value2
FROM
    Table1
    FULL OUTER JOIN Table2 ON Table1.ID = Table2.ID

答案 1 :(得分:2)

首先,在我所知道的任何数据库中,您的查询在语法上都是无效的。 FROM中的每个表都有一个名为ID的列。因此,ID中的不合格SELECT是不明确的 - 不知道它来自哪个表格。

其次,如果你有SELECT table1.ID, table2.ID,那么你会看到发生了什么。当ID在一个表中而不在另一个表中时,则另一个值为NULL

许多数据库都支持ANSI标准using子句。有了这个,你可以这样做:

SELECT ID, Value1, Value2
FROM Table1 FULL OUTER JOIN
     Table2 
     USING (ID);

另一种方法是使用COALESCE()函数。