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

Why am I getting blank values on the matched column for a FULL 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   | Value1 | Value2 |
+------+--------+--------+
| ABC  | 125    | 317    |
| DEF  | 13     |        |
|      |        | 95     |
+------+--------+--------+

为什么我的身份证是空白的?我的查询如下:

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

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

试试这个:

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

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

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

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

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

替代方法是使用 COALESCE() 函数。