Oracle-连接三个表并获取记录

时间:2018-07-08 10:16:57

标签: sql oracle

我有三个带有以下数据的表

表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

2 个答案:

答案 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。

我一直发现,整齐地布置代码使这样的问题更容易发现。