DB2:Left Join 被 Where 子句覆盖?

use*_*705 2 db2

我有一个使用左连接的查询。在某些情况下,联接表中将不存在匹配的记录,但我仍然希望返回表 A 中匹配的所有记录。在处理 ('Complete') 中的 AND TRIM (status) 之前,我所拥有的似乎运行良好,这会过滤掉表 A 中在 myjoined 表中没有匹配项的记录。当 DB2 中没有相关记录时,如何让 DB2 忽略状态标准(表 b)?我仍然希望表 A 中的所有内容都与其余标准相匹配。

SELECT DISTINCT evecas, everef, evetyp, evesfc, eveplc, eveofb,
trim(evetrt) || '-' || (eveprg) as PGM,
evestf,
DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)) AS EVENTDATE,
(select stfnam from staffmstr where smmnum = evestf), 
lwsys.isodates(evefyr, evefmm, evefdd) AS DOSYYMD, 
evetim,
eveend,
TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) AS TOTAL_MINUTE_TIME
,
(select trim (cltfst) || ' ' || (cltlst) as CLIENT from cltmstpf where cltcas = evecas), 
evecnf, evesrv, evecpt, eveamt, evepun,
eveprc, status, lwsys.isodates(evepyr, evepmm, evepdd) AS PROCYYMD,
(case
when evecpt LIKE '%90832%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 38 then '1'
when evecpt LIKE '%90832%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 15 AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 38 then '.5'
when evecpt LIKE '%90832%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 16 then '0'
when evecpt LIKE '%90834%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 38 then '1'
when evecpt LIKE '%90834%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 15 AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 38 then '.5'
when evecpt LIKE '%90834%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 16 then '0'
when evecpt LIKE '%90837%' OR evesrv LIKE '%T001%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 38 then '1'
when evecpt LIKE '%90837%' OR evesrv LIKE '%T001%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) > 15 AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 38 then '.5'
when evecpt LIKE '%90837%' OR evesrv LIKE '%T001%' AND TIMESTAMPDIFF(4,CHAR(TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(eveend))-TIMESTAMP(DATE(DIGITS(evefyr)||'-'||DIGITS(evefmm)||'-'||DIGITS(evefdd)), LWSYS.TIME_4(evetim)))) < 16 then '0'
when evecpt LIKE '%90792%' then '1'
when evecpt LIKE '%90831%' then '.25'
when evecpt LIKE '%90833%' then '.25'
when evecpt LIKE '%90836%' then '1'
when evecpt LIKE '%90838%' then '1'
when evecpt LIKE '%T004%' then '1'
when evecpt LIKE '%T003%' then '1'
when evecpt LIKE '%T002%' then '1'
when evecpt LIKE '%90853%' then '.25'
when evecpt LIKE '%90870%' then '.55'
when evecpt LIKE '%96372%' then '.2'
when evecpt LIKE '%99212%' then '.25'
when evecpt LIKE '%99213%' then '.33'
when evecpt LIKE '%99214%' then '.5'
when evecpt LIKE '%99215%' then '1'
when evecpt LIKE '%E001%' then 'NONE'
when evecpt LIKE '%G001%' then 'NONE'
when evecpt LIKE '%I001%' then 'NONE'
when evecpt LIKE '%L001%' then 'NONE'
when evecpt LIKE '%M001%' then 'NONE'
when evecpt LIKE '%P010%' then 'NONE'
when evecpt LIKE '%TP05%' then '.5'
when evecpt LIKE '%TP10%' then '1'
when evecpt LIKE '%TP15%' then '1.5'
when evecpt LIKE '%TP20%' then '2'
when evecpt LIKE '%TP25%' then '2.5'
when evecpt LIKE '%TP30%' then '3'
when evecpt LIKE '%TP35%' then '3.5'
when evecpt LIKE '%TP40%' then '4'
when evecpt LIKE '%TP45%' then '4.5'
when evecpt LIKE '%TP50%' then '5'
when evecpt LIKE '%TP55%' then '5.5'
when evecpt LIKE '%TP60%' then '6'
when evecpt LIKE '%T099%' then 'NONE'
when evecpt LIKE '%T100%' then 'NONE'
when evecpt LIKE '%TP01%' then 'NONE'
when evecpt LIKE '%H0032%' then 'NONE'
when evecpt LIKE '%H0035%' then 'NONE'
when evecpt LIKE '%P010%' then 'NONE'
when evecpt LIKE '%99221%' then '.5'
when evecpt LIKE '%99222%' then '1.5'
when evecpt LIKE '%99223%' then '1.5'
when evecpt LIKE '%99231%' then '.5'
when evecpt LIKE '%99232%' then '.5'
when evecpt LIKE '%99233%' then '.5'
when evecpt LIKE '%99238%' then '.5'
when evecpt LIKE '%99239%' then '.5'
when evecpt LIKE '%99408%' then '.5'
when evecpt LIKE '%99409%' then '1'
when evecpt LIKE '%G0177%' then '.25'
when evecpt LIKE '%G0410%' then '.25'
when evecpt LIKE '%G0176%' then '.25'
when evecpt LIKE '%T007%' then '.25'
when evecpt LIKE '%T005%' then '.25'
when evecpt LIKE '%T006%' then '.25'
when evecpt LIKE '%T002%' then '1'
when evecpt LIKE '%T003%' then '1'
ELSE NULL
END
) AS VALUE
--  from evetrnpf, doctsk
from evetrnpf
LEFT JOIN doctsk AS DT ON DT.evetrn_id = everef AND DT.client_id = evecas 
WHERE lwsys.isodates(evefyr, evefmm, evefdd) BETWEEN ? AND ?
AND TRIM (status) in ('Complete')
AND evetyp = 'S'
 AND evecas <> 0
ORDER BY stfnam, evecas
Run Code Online (Sandbox Code Playgroud)

Ran*_*gen 5

DB2:Left Join 被 Where 子句覆盖?

如果向 where 子句添加搜索参数,它将过滤掉它,即使它是左连接。因为 where 子句是在左连接之后处理的。如果您想保留记录,即使

Status != ('Complete')
Run Code Online (Sandbox Code Playgroud)

尝试改变这个

LEFT JOIN doctsk AS DT ON DT.evetrn_id = everef AND DT.client_id = evecas 
WHERE lwsys.isodates(evefyr, evefmm, evefdd) BETWEEN ? AND ?
AND TRIM (status) in ('Complete')
Run Code Online (Sandbox Code Playgroud)

对此:

LEFT JOIN doctsk AS DT ON DT.evetrn_id = everef AND DT.client_id = evecas    
AND TRIM (status) in ('Complete')
WHERE lwsys.isodates(evefyr, evefmm, evefdd) BETWEEN ? AND ?
Run Code Online (Sandbox Code Playgroud)

编辑 2

OnAND TRIM (status) <> ''返回我的数据集的所有内容:

询问

   SELECT DISTINCT * 
   FROM evetrnpf
   LEFT JOIN doctsk AS DT ON DT.evetrn_id = everef AND DT.client_id = evecas 
   AND TRIM (status) <> '';
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

编辑

事实上,即使在我将“AND TRIM (status) in ('Complete')”注释掉后,我也得到了相同数量的结果

这是正常行为,因为您正在LEFT JOIN 按照此问题的要求进行操作:

当 DB2 中没有相关记录时,如何让 DB2 忽略状态标准(表 b)?

这种行为的例子:

询问:

SELECT DISTINCT * 
FROM evetrnpf
LEFT JOIN doctsk AS DT ON DT.evetrn_id = everef AND DT.client_id = evecas 
AND TRIM (status) in ('Complete');
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

测试数据 CREATE TABLE doctsk ( evetrn_id int,status varchar(20), client_id varchar(20) );

INSERT INTO doctsk(evetrn_id,status,client_id)

VALUES(1,'  Complete  ',1);


INSERT INTO doctsk(evetrn_id,status,client_id)

VALUES(2,'  NOTComplete  ',2);


INSERT INTO doctsk(evetrn_id,status,client_id)

VALUES(3,'Complete  ',3);


INSERT INTO doctsk(evetrn_id,status,client_id)

VALUES(4,'   Complete',4);


CREATE TABLE evetrnpf  (    everef   int,val varchar(20),evecas  int);

INSERT INTO evetrnpf(everef,val,evecas)

VALUES(1,'bla',1);



INSERT INTO evetrnpf(everef,val,evecas)

VALUES(2,'bla',2);

INSERT INTO evetrnpf(everef,val,evecas)

VALUES(3,'bla',3);

INSERT INTO evetrnpf(everef,val,evecas)

VALUES(4,'bla',4);
Run Code Online (Sandbox Code Playgroud)