在左连接上使用选择案例?

时间:2018-04-13 10:43:54

标签: sql oracle join left-join

我在我的两张桌子上使用了左连接。现在我想用case来识别左表中没有匹配的记录。这样的记录存在并且在我的连接的'id_zeus'列中具有空值,但是当我执行该情况时,这些字段不存在。我哪里错了?我在我的所有专栏“干扰”中得到“现在”。我正在使用Oracle SQL开发人员。

SELECT 
    CASE DP.ID_PRB
    WHEN  NULL
    THEN 'Absence'
    ELSE 'Present'    END as Disturbance,
FROM 
  FIRE.WSITE WI 
  LEFT JOIN 
    (SELECT DISTINCT 
      DPL.ID_PERT as ID_PRB 
     FROM FIRE.DEPPLAN DPL 
     GROUP BY DPL.ID_PERT
    ) DPL
    ON WI.ID_PERT = DP.ID_PERT

1 个答案:

答案 0 :(得分:1)

什么是SELECT DISTINCT?你好像不需要它。 GROUP BYNULL是多余的,因此只使用其中一个。并且子查询上的别名不正确。

但您的问题是与CASE的比较。当你在IS NULL进行比较时,它甚至不匹配。您需要使用SELECT (CASE WHEN DP.ID_PRB IS NULL THEN 'Absence' ELSE 'Present' END) as Disturbance, FROM FIRE.WSITE WI LEFT JOIN (SELECT DISTINCT DPL.ID_PERT as ID_PRB FROM FIRE.OSI_DEVIATION_PLANS DP ) DP ON WI.ID_PERT = DP.ID_PERT;

SELECT (CASE WHEN NOT EXISTS (SELECT 1
                              FROM FIRE.OSI_DEVIATION_PLANS DP
                              WHERE WI.ID_PERT = DP.ID_PERT
                             )
             THEN 'Absence' ELSE 'Present'
        END) as Disturbance,
FROM FIRE.WSITE WI ;

此查询通常写为:

a + b + c

这为优化提供了更多机会。