我有一个使用左连接的查询。在某些情况下,联接表中将不存在匹配的记录,但我仍然希望返回表 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)
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)
归档时间: |
|
查看次数: |
121 次 |
最近记录: |