2017-09-15 64 views
0

我有兩個不同的表(從多個來源提取以獲得這些意見),具有完全相同的列名稱,我試圖從表A中找到值,這是從表B的差異。從2個相同的表列之間的sql差異

爲表A樣本數據:

 id  | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 2017-07-04 
    2  | 0150  | 2017-07-02 |  141949394 | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    4  | 0150  | 2017-07-02 |  141945276 | 2017-07-31 
    5  |   |   |    | 2017-07-31 
    6  | 0150  | 2017-07-02 |  141937311 | 2017-07-04 
    7  |   |   |    | 2017-07-27 
    8  | 0120  | 2017-09-01 |  142080557 | 2017-08-01 
    9  |   |   |    | 2017-07-31 
    10  |   |   |    | 2017-07-31 
    15  | 0150  | 2017-07-02 |  141933588 | 2017-07-31

爲表B示例數據:

Table B: 
    id  | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    11  | 0150  | 2017-09-05 |  142081004 | 
    12  | 0150  | 2017-09-05 |  142082062 | 
    1  |   |   |    | 2017-07-04 
    16  | 0120  | 2017-07-02 |  141949391 | 
    2  |   |   |    | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    3  | 4910  | 2017-07-02 |  141949304 | 2017-07-04 
    13  | 0150  | 2017-07-02 |  141947246 | 
    4  | 0150  | 2017-07-02 |  141945276 | 2017-07-31 
    14  | 0150  | 2017-07-02 |  141943912 | 
    5  |   |   |    | 2017-07-31 
    6  |   |   |    | 2017-07-04 
    15  | 0150  | 2017-07-02 |  141933588 | 
    7  |   |   |    | 2017-07-27 
    8  |   |   |    | 2017-08-01 
    9  |   |   |    | 2017-07-31 
    10  |   |   |    | 2017-07-31

我已經使用

select * from table_A except select * from table_b; 

結果樣品:

 id | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 2017-07-04 
    2  | 0150  | 2017-07-02 |  141949394 | 2017-07-04 
    8  | 0120  | 2017-09-01 |  142080557 | 2017-08-01 
    6  | 0150  | 2017-07-02 |  141937311 | 2017-07-04 
    15  | 0150  | 2017-07-02 |  141933588 | 2017-07-31

它給了我不同行,但我需要的是不同的 預期結果列值:

 id | code | dos  |  entry_id | survey_date 
------------+----------+------------+----------------+------------- 
    1  | 0120  | 2017-07-02 |  141949406 | 
    2  | 0150  | 2017-07-02 |  141949394 | 
    8  | 0120  | 2017-09-01 |  142080557 | 
    6  | 0150  | 2017-07-02 |  141937311 | 
    15  |   |   |    | 2017-07-31

預期的結果集ID = 1有survey_date值,因爲該值是表B的一部分,我需要它爲null。同樣,對於行id = 15,除了survey_date以外,每個列都匹配,因此結果應該除了survey_date之外的所有列值都爲null,我該如何實現?對不起,如果它已發佈較早

+1

改變爲具有期望輸出 – bocadev

+0

它必須是 「SELECT *」 或可能是「選擇ID,密碼,DOS,entry_id,survey_date描述,等等 –

+0

它可以選擇ID,代碼,DOS等 – bocadev

回答

0

你需要做的是比較每個領域單獨和代碼在一個「案件」,當他們匹配或不匹配表a和b匹配時做什麼。然後,您需要整體排除整行匹配的行。下面我會做到這一點,並使用row_to_json來協助比較整個行。可能比row_to_json更有效,但這應該起作用。

select 
a.id, 
case when a.code=b.code then null 
    else b.code end code, 
case when a.dos=b.dos then null 
    else b.dos end dos, 
case when a.entry_id=b.entry_id then null 
    else b.entry_id end entry_id, 
case when a.survey_date=b.survey_date then null 
    else b.survey_date end survey_date 
from table_a a 
join table_b b on b.id=a.id 
where row_to_json(a) != row_to_json(b) 
+0

謝謝Joe,它對於給定的示例數據非常有用,我很抱歉,我沒有提到Table_a id列不是主鍵既不是我的示例數據足夠明顯可以使其清楚,它也可以具有重複ids on multiple rows。加入一列在這種情況下將不夠用 – bocadev

+0

這有助於你找到答案嗎?主鍵是什麼 - 你有GOT有辦法鏈接兩條記錄在每個表中 - 給我,我會給你一個答案。 –

+0

這些數據提供臨時t在示例中提供的「table_a」數據是通過連接其他幾個表而獲得的,而「table_b」數據是從json列派生的,這就是爲什麼我沒有任何表上的主鍵。 – bocadev