SQL表连接与coalesce

时间:2015-07-13 07:05:59

标签: sql

我想使用左连接加入两个表,但结果不是我所期待的。

SELECT name, date, COALESCE(NumberOfPosts, 0) AS NumberOfPosts FROM categories c LEFT JOIN (SELECT cat_id, COUNT(*) AS NumberOfPosts FROM posts GROUP BY cat_id) p ON c.id = p.cat_id 无效。 EMP_ID is_selected仍会显示。

我不知道我的查询有什么不对,请你帮忙吗?

004

表a

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'

表b

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               

输出错误

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

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为您的查询工作正常。看看这个SQLFiddle here,它会根据您的样本数据显示结果是否正确返回。

如果您注释掉WHERE子句,您将获得N的{​​{1}}值(显然)。

我认为您的IS_SELECTED表格中有一行符合B条件的额外行并返回结果。

您可以通过运行以下查询来检查是否有这个符合此条件的额外行:

JOIN