【问题标题】:Why am I getting blank values on the matched column for a FULL OUTER JOIN?为什么我在 FULL OUTER JOIN 的匹配列上得到空白值?
【发布时间】:2016-11-22 01:11:41
【问题描述】:

我有两张表要合并在一起。为简单起见,它们各有两列:表中通用的 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     |
+------+--------+--------+

但我看到的是,如果 ID 在 Table1 中不存在,则不会将其复制到合并结果中:

+------+--------+--------+
| 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 的公司内部语言。虽然存在一些差异,但我想我会先检查我对连接语法的理解。

【问题讨论】:

  • 键和外键列在 SQL 中并没有神奇地组合在一起。您需要明确使用COALESCE 或修改您的消费程序以接受两个关键列。

标签: sql outer-join


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2011-03-14
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多