2017-04-09 69 views
0

,我有以下數據:DB2 SQL比較上JOIN

TABLE1: 
ADDRESS    INTER1 INTER2 
12345 E AVE STREET 44444  55555555 
888 OtherStreet  44444  55555555 


TABLE2: 
ADDRESS    INTER1 INTER2 
12345 E AVE STREET 44444 55555555 

我可以在代碼中可能解決這樣:

if(tblOneInterOne == tblTwoInterOne) { 
    // compare address         
} 

,但希望能在SQL來解決。

SELECT 
    A.ADDRESS 
    , A.INTER1 
    , A.INTER2 
FROM TABLE1 AS A 
    LEFT JOIN TABLE2 AS B 
    ON A.INTER1 = B.INTER1 
    AND A.INTER2 = B.INTER2 
    AND A.ADDRESS <> B.ADDRESS 

當上面的SQL相比,我仍然得到這個地址:12345êAVE街道上,我的數據結果。我也嘗試加入一個子查詢,我也嘗試了分組,並通過asc進行排序。我沒有想法。

預期輸出:如果從TABLE1中選擇匹配前兩個整數,如果匹配,則比較地址。如果匹配,請不要顯示。如果不匹配,則顯示不匹配的地址。反之亦然,如果從TABLE2中選擇,則匹配前兩個整數。如果匹配,則在地址上進行比較,如果不匹配,那麼顯示應爲空(無數據)。

任何幫助,將不勝感激。

謝謝。

+0

什麼是你期望的輸出 – Utsav

+0

好問題。我已將預期輸出添加到我的問題中。謝謝你Utsav。 –

回答

0

解決這個問題是以下幾點:

SELECT 
    A.ADDRESS 
    , A.INTER1 
    , A.INTER2 
FROM TABLE1 AS A 
    INNER JOIN TABLE2 AS B 
     ON A.INTER1 = B.INTER1 
     AND A.INTER2 = B.INTER2 
    LEFT JOIN TABLE2 AS B1 
     ON B1.ADDRESS <> B.ADDRESS 
WHERE A.ADDRESS <> B.ADDRESS 
AND B1.ADDRESS IS NOT NULL 

這使得相匹配,對前兩個整數值,然後加入上的地址。但是,這會導致多個地址的記錄仍然顯示。這被WHERE子句比較消除。

這是提供商數據的實際生產問題。一旦解決方案被發現,看起來非常簡單 - 但到達解決方案始終是棘手的部分,對吧?我希望這可以幫助別人。

編輯2016年4月24日

經過質量檢驗,這一解決方案需要額外的條款,這是:

SELECT 
    A.ADDRESS 
    , A.INTER1 
    , A.INTER2 
FROM TABLE1 AS A 
    INNER JOIN TABLE2 AS B 
     ON A.INTER1 = B.INTER1 
     AND A.INTER2 = B.INTER2 
    LEFT JOIN TABLE2 AS B1 
     ON B1.ADDRESS <> B.ADDRESS 
WHERE NOT IN (SELECT B2.ADDRESS FROM TABLE2 AS B2 
        INNER JOIN TABLE1 AS A2 
        ON B2.INTER1 = A2.INTER1 
         AND B2.INTER2 = A2.INTER2) 

A.ADDRESS <> B.ADDRESS 
AND B1.ADDRESS IS NOT NULL 

當然的 'WHERE NOT IN' 允許子查詢排除發現的任何東西。這也可以使用CTE然後在NOT IN子句中排除。我希望這可以幫助別人。

0

這個查詢:

SELECT A.ADDRESS, A.INTER1, A.INTER2 
FROM TABLE1 A LEFT JOIN 
    TABLE2 B 
    ON A.INTER1 = B.INTER1 AND 
     A.INTER2 = B.INTER2 AND 
     A.ADDRESS <> B.ADDRESS; 

是要在A返回所有行。這就是LEFT JOIN所做的。這就是它應該做的。

如果你想從第一臺過濾行,然後更改JOIN類型:

SELECT A.ADDRESS, A.INTER1, A.INTER2 
FROM TABLE1 A INNER JOIN 
    TABLE2 B 
    ON A.INTER1 = B.INTER1 AND 
     A.INTER2 = B.INTER2 AND 
     A.ADDRESS <> B.ADDRESS; 

然後你也可以移動的不平等條件WHERE。但是使用LEFT JOIN,然後將不等式移動到WHERE是相當荒謬的 - 爲什麼指定一個外連接,然後在WHERE子句中撤消它?

+0

嗨戈登,我已經嘗試了兩種可能性,結果相同。請參閱更新的「預期產出」。 –

0

試試這個:

SELECT 
     ifnull(f1.INTER1, f2.INTER1) as INTER1, 
     ifnull(f1.INTER2, f2.INTER2) as INTER2, 
     f1.ADDRESS as ADDRESS_A, f2.ADDRESS as ADDRESS_B, 
     case 
     when f1.INTER1 then 'ADDRESS NOT IN TABLE1' 
     when f2.INTER1 then 'ADDRESS NOT IN TABLE2' 
     else 'ADDRESS ARE DIFFERENT' end as DIAGNOSTIC 
FROM TABLE1 f1 
FULL OUTER JOIN TABLE2 f2 ON (f1.INTER1, f1.INTER2) = (f2.INTER1, f2.INTER2) 
where 
     f1.INTER1 is null or 
     f2.INTER1 is null or 
     f1.ADDRESS <> f2.ADDRESS; 
0
--other solution if you want your result into multiple rows 

select * from 
(
select ADDRESS, INTER1, INTER2 from table1 
except 
select ADDRESS, INTER1, INTER2 from table2 
) tmp1 

union all 

select * from 
(
select ADDRESS, INTER1, INTER2 from table2 
except 
select ADDRESS, INTER1, INTER2 from table1 
) tmp2