即使存在条件,也显示两个表中的所有数据行

时间:2015-10-22 13:51:20

标签: sql

我有一个来自两个表的SQL查询,但我需要一些帮助来扩展结果。

我正在运行的查询是:

SELECT 
    B.OBJ_FULL, B.SUBJ_FULL, B.ACT_YTD_TY, 
    SUM(A.JNL_VALUE) AS JNL_TOTAL
FROM 
    DB2ADM2.JNLFILE A 
INNER JOIN 
    DB2ADM2.TFINCATP B ON B.OBJ_FULL = A.JNL_OBJ
                       AND B.SUBJ_FULL = A.JNL_SUBJ
WHERE 
    A.JNL_YEAR ='15'
    AND A.JNL_PROCESSED ='N'
    AND OBJ_FULL = 'TBBBB'
GROUP BY 
    B.OBJ_FULL, B.SUBJ_FULL, B.ACT_YTD_TY

返回的数据是:

OBJ_FULL SUBJ_FULL  ACT_YTD_TY  JNL_TOTAL
-----------------------------------------
TBBBB    9404       -9666.73    -547.78
TBBBB    9405       -13098.05   -24.39

我现在已将上面的查询拆分为两个单独的查询,以显示每个查询返回的数据。

查询1 - 本周未在代码TBBBB上处理的日记帐值

SELECT 
    JNL_OBJ, JNL_SUBJ, SUM(JNL_VALUE) AS JNL_VALUE
FROM 
    DB2ADM2.JNLFILE
WHERE 
    JNL_YEAR ='15'
    AND JNL_PROCESSED ='N'
    AND JNL_OBJ = 'TBBBB'
GROUP BY 
    JNL_OBJ, JNL_SUBJ

查询1的结果

JNL_OBJ JNL_SUBJ  JNL_VALUE
---------------------------
TBBBB   9404      -547.78
TBBBB   9405      -24.39

查询2 - 代码TBBBB的年初至今值

SELECT 
    OBJ_FULL, SUBJ_FULL, ACT_YTD_TY
FROM 
    DB2ADM2.TFINCATP 
WHERE  
    OBJ_FULL = 'TBBBB'

查询2的结果

OBJ_FULL  SUBJ_FULL  ACT_YTD_TY
-------------------------------
TBBBB     3420     12000
TBBBB     3473     18453.02
TBBBB     3524     2480.4
TBBBB     3704     585
TBBBB     6812     0 
TBBBB     6910     0
TBBBB     7704     -4142.71
TBBBB     8199     -25
TBBBB     9400     -168363.1
TBBBB     9403     -457.56
TBBBB     9404     -9666.73
TBBBB     9405     -13098.05
TBBBB     9812     0

我要查找的结果是查询2,其中包含来自查询1的附加列,这是JNL_VALUE,但是因为每个TBBBB代码每周都没有日记,所以当前只返回带日记的行,该列如果当前值不存在,则必须插入0。

我有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你应该在这里LEFT OUTER JOIN并在JOIN的JNLFILE子句中限制ON表,这样你就不会在加入后过滤结果,但之前(您也可以在子查询中完成:

     SELECT B.OBJ_FULL,
    B.SUBJ_FULL,
    B.ACT_YTD_TY,
   COALESCE(SUM(A.JNL_VALUE), 0) AS JNL_TOTAL
FROM DB2ADM2.TFINCATP B
 LEFT OUTER JOIN DB2ADM2.JNLFILE A ON 
    B.OBJ_FULL = A.JNL_OBJ AND
    B.SUBJ_FULL = A.JNL_SUBJ AND
    A.JNL_YEAR = '15' AND
    A.JNL_PROCESSED = 'N'
WHERE B.OBJ_FULL = 'TBBBB'
GROUP BY B.OBJ_FULL,
    B.SUBJ_FULL,
    B.ACT_YTD_TY

您可以将TFINCATP视为您的"驱动程序"表,然后只从我们LEFT OUTER JOIN的JNLFILE表中选取值。

答案 1 :(得分:0)

如果你想在没有A记录与B匹配时想要零:

SELECT B.OBJ_FULL, B.SUBJ_FULL, B.ACT_YTD_TY, isnull(A.JNL_VALUE, 0) AS JNL_VALUE
FROM DB2ADM2.JNLFILE A 
Right Outer JOIN DB2ADM2.TFINCATP B ON B.OBJ_FULL = A.JNL_OBJ
AND B.SUBJ_FULL = A.JNL_SUBJ
WHERE A.JNL_YEAR ='15'
AND A.JNL_PROCESSED ='N'
AND OBJ_FULL = 'TBBBB'

(在外连接上搜索:有左,右和全外连接。)因为你想要每个B行,所以我删除了Group By。并且即使没有匹配的A,也要放入正确的外部联接以获得所有B。