我有三个带有以下数据的表
表A
JOB_NAME APP_NAME START_TIME
A ABC 00:00
C ABC 00:00
C ABCD 00:30
表B
JOB_NAME APP_NAME SLA
A ABC 01:00
B ABC 01:00
C ABC 01:00
C ABCD 01:30
表C
JOB_NAME APP_NAME PARENT
A ABC N/A
B ABC A
C ABC B
C ABCD N/A
我需要加入这些表并生成以下输出。
JOB_NAME APP_NAME PARENT START_TIME SLA
A ABC N/A 00:00 01:00
B ABC A N/A 01:00
C ABC C 00:00 01:00
但是我写的查询在输出下面返回。
JOB_NAME APP_NAME PARENT START_TIME SLA
A ABC N/A 00:00 01:00
C ABC B 00:00 01:00
请帮助解决此问题。
SELECT C.JOB_NAME,C.APP_NAME,C.PARENT,NVL(A.START_TIME,'N/A') AS START_TIME,B.SLA FROM C
LEFT JOIN B
ON UPPER(C.JOB_NAME) = UPPER(B.JOB_NAME)
LEFT JOIN A ON UPPER(C.JOB_NAME) = UPPER(A.JOB_NAME) WHERE C.APP_NAME='ABC' AND C.APP_NAME=A.APP_NAME AND C.APP_NAME=B.APP_NAME
答案 0 :(得分:3)
您已在WHERE子句中复制了JOIN逻辑:
ON UPPER(C.JOB_NAME) = UPPER(B.JOB_NAME)
...
WHERE ... AND C.APP_NAME=A.APP_NAME AND C.APP_NAME=B.APP_NAME
从而将您的外部联接变成INNNER联接。摆脱多余的WHERE子句部分,就可以了。
顺便说一句:对于您的示例数据,无需进行UPPER
转换;尽可能删除它(因为它将使JOB_NAME
列上的索引无效)
答案 1 :(得分:0)
尝试一下:
select c.job_name
, c.app_name
, c.parent
, nvl(a.start_time,'N/A') as start_time
, b.sla
from c
left join b
on upper(b.job_name) = upper(c.job_name)
and b.app_name = c.app_name
left join a
on upper(a.job_name) = upper(c.job_name)
and a.app_name = c.app_name
where c.app_name = 'ABC'
您在A上有WHERE
个子句条件,要求每行都有一个值,而这不包括A。
我一直发现,整齐地布置代码使这样的问题更容易发现。