我有兩個具有相同結構和幾乎相同內容的表格。主要區別在於一個值列可能與第二個表中的「等值」列不同。最重要的是,一張表可能出現在一張表中,但另一張沒有。顯示來自兩個不同表格(比較表)的兩列之間的差異
我的表:
表1(IDA,值a,VALUEB,valueC(可爲空),valueX)
表2(IDB,值a,VALUEB,valueC(可爲空),VALUE年)
期望的結果:
表3(值a,VALUEB,valueC,valueX,VALUE年)
個前提:
- 「ID」是主鍵,並且可以在兩個表
- 「valueC」在不同的是,可以有一個空值的唯一的列。但是,兩個表中的值都是相同的。
- 如果記錄出現在表1,但不是在表2,「VALUE年」應爲空
- 如果記錄出現在表2,但不是在表1,「valueX」應空
示例:
表1
1 | 1001 | 2001 | 3001 | 100.0
2 | 1002 | 2002 | 3002 | 95.0
3 | 1003 | 2003 | (null)| 113.0
4 | 1004 | 2004 | 3004 | 75.0
表2
23 | 1001 | 2001 | 3001 | 100.0
24 | 1002 | 2002 | 3002 | 94.0
25 | 1003 | 2003 | (null)| 116.0
26 | 1005 | 2005 | 3005 | 32.0
期望的結果應該是:
表3
1001 | 2001 | 3001 | 100.0 | 100.0
1002 | 2002 | 3002 | 95.0 | 94.0
1003 | 2003 | (null)| 113.0 | 116.0
1004 | 2004 | 3004 | 75.0 | (null)
1005 | 2005 | 3005 | (null)| 32.0
我想我已經想出了一個解決方案,但它非常緩慢,我不確定這是否真的是最簡單的方法來做到這一點。
SELECT valueA, valueB, valueC, valueX, valueY
FROM (
(SELECT t1.valueA, t1.valueB, t1.valueC, t1.valueX, t2.valueY
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.valueA = t2.valueA
AND t1.valueB = t2.valueB
WHERE t1.valueC = t2.valueC OR t1.valueC IS NULL OR t2.valueC IS NULL)
UNION
(SELECT t2.valueA, t2.valueB, t2.valueC, t1.valueX, t2.valueY
FROM Table2 t2
LEFT JOIN Table1 t1
ON t1.valueA = t2.valueA
AND t1.valueB = t2.valueB
WHERE t1.valueC = t2.valueC OR t1.valueC IS NULL OR t2.valueC IS NULL)
);
我希望有人能想出一個更優雅的解決方案。作爲一個方面說明,我正在使用Oracle數據庫。預先感謝您的時間和幫助!
如果PK可以在兩個表之間的差異,你怎麼匹配的記錄,即,你怎麼能確定,如果/當「一個記錄可能出現在一個表中,而不是在其他的」 – 2015-02-06 16:07:27
對於我的目的是足以匹配基於值A,B和C的記錄(這裏的示例是簡化的,我的實際表格有7個匹配的列)。所以如果A,B和C匹配,我們可以認爲它是相同的記錄。如果其中一個沒有,這是一個不同的記錄。所以,如果你在table1中有ABC值,但在table2中沒有匹配,那麼它在table2中就沒有了。 – Kratos 2015-02-09 09:48:57
然後在列A,B和C上添加一個鍵。這樣的聲音可能是「自然鍵」。如果你不能,做到這一點是因爲重複,那麼你可以「假設它們是相同的記錄」並不是真的 – 2015-02-09 13:41:31