2015-07-13 84 views
1

我想用左連接加入兩個表,但結果不是我所期待的。SQL表加入合併

is_selected不起作用。 EMP_ID 004仍然顯示。

我不知道什麼是不正確的與我的查詢,你可以請幫忙嗎?

SELECT DISTINCT a.Type, 
COALESCE(a.EMP_ID, b.EMP_ID) AS ID, 
    a.Deduction_No, 
    a.Home_Amt, 
    a.Deduction_Amt, 
    a.Group_ID, 
    b.Is_Selected 
    From Table a 
LEFT JOIN TABLE b(a.Deduction_No = b.Deduction_No) 
WHERE Is_Selected = 'Y' 

表一個

Deduction_No Type GROUP_ID EMP_ID  Service_code AMT 
V1001   EMP     001  D1008   10  
V1001   GRP  G185  NULL  C1009   20   
V1001   GRP  G185  NULL  C1009   35   
V1001   GRP  G185  NULL  C1009   20    

表B

Deduction_No GROUP_ID EMP_ID  Is_Selected AMT 
V1001   G185  001    Y  20 
V1001   G185  001    N   0 
V1001   G185  002    Y  35 
V1001   G185  002    N  0 
V1001   G185  003    Y  20  
V1001   G185  003    N  0 
V1001   G185  004    Y  20 
V1001   G185  004    N  20 

輸出與錯誤

Deduction_No Type GROUP_ID EMP_ID  Service_code AMT Is_Selected 
V1001   EMP     001  D1008   10   Y 
V1001   GRP  G185  001  C1009   20   Y 
V1001   GRP  G185  002  C1009   35   Y 
V1001   GRP  G185  003  C1009   20   Y            
V1001   GRP  G185  004  C1009   95   Y 

希望的輸出

Deduction_No Type GROUP_ID EMP_ID  Service_code AMT Is_Selected 
V1001   EMP     001  D1008   10   Y 
V1001   GRP  G185  001  C1009   20   Y 
V1001   GRP  G185  002  C1009   35   Y 
V1001   GRP  G185  003  C1009   20   Y            

謝謝

+0

在有問題的輸出的'AMT'列具有'85'值似乎不匹配您的任何樣本數據。是否有可能你有'IS_SELECTED ='Y''和Deduction_No ='V1001'的另一行? –

回答

0

可以請你檢查這一點,如果它的工作原理:

     SELECT DISTINCT a.Type_cd, 
         COALESCE (a.EMP_ID,b.EMP_ID) AS ID, 
         a.Deduction_No, 
         a.Group_ID, 
         a.Service_code, 
         b.Is_Selected, 
         SUM(a.AMT) 
         FROM supplier_app.a a 
         RIGHT OUTER JOIN (Select Deduction_No,GROUP_ID,EMP_ID,Is_Selected FROM supplier_app.b WHERE Is_Selected ='Y' GROUP BY Deduction_No,GROUP_ID,EMP_ID,Is_Selected) b ON (a.Deduction_No = b.Deduction_No) 
         Group by  a.Type_cd,ID, 
         a.Deduction_No, 
         a.Group_ID, 
         a.Service_code, 
         b.Is_Selected; 

下面是答案:

      Type     ID   Deduction_No GROUP_ID Service_code delete_ind  Sum(AMT) 
         -------------------- ---------- ------------ ---------- ------------ ---------- ----------- 
         EMP     001   V1001   ?   D1008   Y     40 
         GRP     001   V1001   G185  C1009   Y     75 
         GRP     002   V1001   G185  C1009   Y     75 
         GRP     003   V1001   G185  C1009   Y     75 
         GRP     004   V1001   G185  C1009   Y     75 
+0

輸出與以前相同。 – user3559600

+0

在表B中,在EMP_ID = 004中有一條記錄,其中is_selected ='Y'。因此它將進入連接。如果我錯了,請糾正我。 @ user3559600 –

+0

我編輯了我的答案。你在下面提到你想結合這些結果,我推測你想對金額做一筆總和。請檢查它是否工作正常。 @ user3559600 –

0

我覺得您的查詢工作正常。看看這SQLFiddle here,它顯示,根據您的示例數據,結果正確返回。

如果您註釋掉WHERE子句,則會得到IS_SELECTED(顯然)的N值。

我認爲你的B表中有一個額外的行,它與JOIN條件匹配並返回結果。

您可以檢查,如果你有這個額外的行,尊重通過運行以下查詢此條件:

SELECT * 
FROM B 
WHERE deduction_no = 'V1001' 
    AND emp_id = '004' 
    AND IS_SELECTED = 'Y' 
+0

我發現每個EMP_ID都顯示'Y'和'N'。我會更新我的表b – user3559600

+0

@ user3559600那麼,我的答案有幫助? –

+0

現在我的問題是如何將它們結合在一起,尤其是Amt – user3559600