2016-09-12 27 views
0
SELECT A.EMP_ID A_EMP_ID, 
    A.EMP_CODE A_EMP_CODE, 
    B.EMP_ID B_EMP_ID, 
    B.EMP_CODE B_EMP_CODE, 
    C.EMP_ID C_EMP_ID, 
    C.EMP_CODE C_EMP_CODE, 
FROM EMP A 
LEFT OUTER JOIN EMP B 
ON A.U_CODE =B.U_CODE 
LEFT OUTER JOIN EMP C 
ON A.U_CODE =C.U_CODE 
WHERE A.SRC ='A' 
AND B.SRC ='B' 
AND C.SRC ='C' 

對於一名員工,我有來自不同來源的數據以及他的id與所有系統不同的地方。數據來自這個表格的數據源有5個以上不同的源系統。在所有來源中,u_code將保持不變。 Emp從每個系統獲取每一行。oracle自身外連接過濾記錄

現在,我需要構建一個跨行表,其中一行中我可以爲單個員工提供所有源系統標識。如果員工在所有三個系統中都有數據,但如果數據僅存在於兩個系統中,則會過濾掉以上數據。

表數據

empid,emp_code,src,u_code 
1,ABC,A,101 
2,PQR,B,101 
3,XYZ,C,101 
4,KPO,A,102 
5,LIP,B,102 

查詢應該返回

A_EMP_ID,A_EMP_CODE,B_EMP_ID,B_EMP_CODE,C_EMP_ID,C_EMP_CODE 
1,ABC,2,PQR,3,XYZ,101 
4,KPO,5,LIP,,,102 

查詢工作正常進行101 u_code但不returing 102

數據庫是Oracle 10g中

+0

只是針對其他用戶,我對此需求使用oracle pivot功能。讓工作變得更容易。 –

回答

1

當你有一個外部連接,您需要注意WHERE cla中的條件使用。我想,你打算:

SELECT . . . 
FROM EMP A LEFT OUTER JOIN 
    EMP B 
    ON A.U_CODE = B.U_CODE AND B.SRC = 'B' LEFT OUTER JOIN 
    EMP C 
    ON A.U_CODE = C.U_CODE AND C.SRC = 'C' 
WHERE A.SRC = 'A' 

什麼在你的版本是發生在B非匹配行和C產生充滿NULL值。 NULL值顯然不符合WHERE的條件,因此這些行會被過濾掉。效果與做INNER JOIN相同。

+0

感謝它的工作正常。但現在它的返回記錄,如果它目前的來源。如果記錄存在不存在A然後它不返回B和C源 –

+0

由於我的初始問題是由您的建議處理,因此選擇了您的問題。我已經去了這個功能的主軸 –

1

如果您無法保證SRC的任何特定值都會出現在U_CODE的任何值上,則一種可能的解決方案是先從EMP實例開始,不進行任何過濾,然後對SRC的每個可能值執行一次LEFT JOIN ,在連接條件中檢查SRC的值:

SELECT DISTINCT 
     A.EMP_ID, A.EMP_CODE, 
     B.EMP_ID, B.EMP_CODE, 
     C.EMP_ID, C_EMP_CODE 
FROM EMP U 
LEFT OUTER JOIN EMP A ON A.U_CODE = U.U_CODE AND A.SRC = 'A' 
LEFT OUTER JOIN EMP B ON B.U_CODE = U.U_CODE AND B.SRC = 'B' 
LEFT OUTER JOIN EMP C ON C.U_CODE = U.U_CODE AND C.SRC = 'C' 
+0

謝謝。它給出了預期的結果。但是,我已經去了樞軸功能。投票你的答案 –