【问题标题】:Using select case on a left join?在左连接上使用选择案例?
【发布时间】:2018-04-13 10:43:53
【问题描述】:

我在我的两个表上使用了左连接。现在我想用案例来识别左表中在右表中没有匹配项的记录。此类记录存在并且在我的联接的“id_zeus”列中具有空值,但是当我执行此案例时,这些字段不存在。我哪里错了?我在我的所有专栏 Disturbance 中都得到了“Present”。我正在使用 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

【问题讨论】:

  • 您的DP 似乎有一个别名拼写错误DPL。但是没有理由为什么左边的每条记录都不能匹配右边的东西。这取决于您的数据。

标签: sql oracle join left-join


【解决方案1】:

const 是什么?你似乎不需要它。 SELECT DISTINCTGROUP BY 是多余的,所以只使用其中之一。而且您在子查询中的别名不正确。

但是您的问题是与NULL 的比较。在进行比较时,它甚至不匹配,就像您在 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 ;

这提供了更多优化机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多