2016-09-23 8 views
0

Я был бы очень признателен за помощь в следующем:Oracle SQL - лучший способ использовать IF NOT EXISTS?

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 и домашний телефон типов, но запись не существует для офисного типа телефона, запрос не вернется его, потому что ОФИСА не существует. Я попробовал операторы CASE, но без типа телефона CASE нечего сравнивать. Я прочитал много сообщений относительно IF NOT EXISTS, но я не уверен, что это правильный путь. Я хочу, чтобы запрос возвращал все EMP_NUM и null, если конкретный PHONE_TYPE не существует.

ответ

0

Использование "Full Outer" присоединяется

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' 
+0

Не совсем то, что я искал, но дальше вдоль чем я. Я буду играть с ним и прокомментировать, когда у меня все будет сортировано. Спасибо. – glennsnoise

+0

Если вы уже не понимаете, google на 'Full Join', чтобы понять, что это такое ... Если вы знаете, что такое внешнее объединение,' full Join' или 'Full Outer Join' является двунаправленным внешним соединением или join, который является «внешним» в обоих направлениях, а не только слева или справа. –

+0

Теперь я читаю о них и примеряю некоторые примеры. Думаю, моя проблема заключается в том, что на моем столе это не значит, что поле пустое. Это то, что, если оно не заполнено, это поле не существует. Если у меня есть несколько экземпляров таблицы (A и B), каждый из которых занимает поле PHONE (A.PHONE и B.PHONE), и они различаются отдельным полем (PHONE_TYPE), как мне создать NULL для PHONE_TYPE, который делает не существует для сотрудника? Это не пусто, его нет. – glennsnoise

0

Я думаю, вы можете попробовать 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' (+) 
+0

Я предполагаю, что (+) не работает по всем направлениям. Я обращаюсь к Oracle (PeopleSoft). Я получаю сообщение об ошибке. – glennsnoise