【问题标题】:Oracle SQL - best way to use IF NOT EXISTS?Oracle SQL - 使用 IF NOT EXISTS 的最佳方式?
【发布时间】:2016-09-23 15:08:41
【问题描述】:

我将非常感谢以下方面的帮助:

SELECT A.EMPLOYEE, A.PHONE AS CELL, B.PHONE AS OFFICE, C.PHONE AS HOME
FROM PHONE_NUMBERS A, PHONE_NUMBERS B, PHONE_NUMBERS C
WHERE A.EMP_NUM = B.EMP_NUM
  AND A.EMP_NUM = C.EMP_NUM
  AND A.PHONE_TYPE = 'CELL'
  AND B.PHONE_TYPE = 'OFFICE'
  AND C.PHONE_TYPE = 'HOME'

我的问题如下:如果员工有 CELL 和 HOME 电话类型,但不存在 OFFICE 电话类型的条目,则查询不会返回他,因为 OF​​FICE 不存在。我尝试过 CASE 语句,但没有电话类型,CASE 没有可比性。我已经阅读了很多关于 IF NOT EXISTS 的帖子,但我不确定这是否是正确的方法。我希望查询返回所有 EMP_NUM,如果不存在特定的 PHONE_TYPE,则返回 null。

【问题讨论】:

    标签: null case exists


    【解决方案1】:

    使用“全外”连接

    SELECT coalesce(h.EMPLOYEE, o.EMPLOYEE, c.EMPLOYEE) Employee,
           c.PHONE AS CELL, o.PHONE AS OFFICE, h.PHONE AS HOME
    FROM PHONE_NUMBERS h
       full join PHONE_NUMBERS o
          On o.EMP_NUM = h.EMP_NUM 
             and h.PHONE_TYPE = 'HOME'
             and o.PHONE_TYPE = 'OFFICE'
       full join PHONE_NUMBERS C
          On c.EMP_NUM = h.EMP_NUM 
             and c.PHONE_TYPE = 'CELL'
    

    【讨论】:

    • 不是我想要的,但它比我更远。当我整理好整个事情时,我会玩它并发表评论。谢谢。
    • 除非您已经了解,否则请在 Full Join 上搜索 Google 以了解这是什么...如果您知道外连接是什么,full JoinFull Outer Join 是双向外连接, 或在两个方向上都“外部”而不是仅向左或向右的联接。
    • 我现在正在阅读它们,并尝试了一些示例。我想我的问题在于,在我的桌子上,并不是一个字段是空白的。就是说,如果不填充,则该字段不存在。如果我有一个表的多个实例(A 和 B),每个占用字段 PHONE(A.PHONE 和 B.PHONE),并且它们由一个单独的字段(PHONE_TYPE)区分,我如何为 PHONE_TYPE 生成 NULL员工不存在?它不是空白的,它不存在。
    【解决方案2】:

    我想你可以试试 OUTER JOIN。 这是带有 (+) 的 OUTER JOIN 的示例

    SELECT A.EMPLOYEE, A.PHONE AS CELL, B.PHONE AS OFFICE, C.PHONE AS HOME
    FROM PHONE_NUMBERS A, PHONE_NUMBERS B, PHONE_NUMBERS C
    WHERE A.EMP_NUM = B.EMP_NUM
    AND A.EMP_NUM = C.EMP_NUM
    AND A.PHONE_TYPE = 'CELL' (+)
    AND B.PHONE_TYPE = 'OFFICE' (+)
    AND C.PHONE_TYPE = 'HOME' (+)
    

    【讨论】:

    • 我猜 (+) 不能全面发挥作用。我正在查询 Oracle (PeopleSoft)。我遇到了一个错误。
    猜你喜欢
    • 2020-05-11
    • 2012-06-05
    • 2010-11-13
    • 2017-06-23
    • 1970-01-01
    • 2021-03-02
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多