我有两张桌子,我试图将它们组合在一起。为简单起见,它们各有两列:表中通用的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的公司内部语言。虽然存在一些差异,但我想我会首先检查我对连接语法的理解。
答案 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()
函数。