2016-11-22 39 views
0

我有兩張桌子,我正試圖將它們組合在一起。爲了簡單起見,它們每個都有兩列:在表中通用的ID和不同的數值。但是,並非所有的ID都出現在兩個表中,因此我使用了FULL OUTER JOIN。爲什麼我在匹配列上獲得完整外部連接的空白值?

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

我希望外部聯接會給我所有的記錄,像這樣:

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

但是我所看到的反而是ID不被複制到合併後的結果,如果它不」 t存在於表1中:

+------+--------+--------+ 
| 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的公司內部語言。儘管存在一些差異,但我認爲我會首先檢查我對join語法的理解。

+0

鍵和外鍵列在SQL中並不神奇。您需要明確使用'COALESCE'或修改您的消費程序以接受兩個關鍵列。 – Dai

回答

2

試試這個:

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()函數。

相關問題