ORACLE SQL: добавление данных с использованием вложенных условий - PullRequest
0 голосов
/ 31 мая 2018

Не могу понять, как добавить данные только там, где они есть.

У меня есть заявление, к которому я хотел бы добавить поля.Но вместо того, чтобы тянуть сотрудников только при соблюдении критериев (т. Е. Оператора WHERE), я хотел бы связать данные, если и только если они существуют.Мой базовый оператор извлекает 30 записей, но когда я добавляю больше деталей в свой оператор WHERE (чтобы включить другие поля), он уменьшает количество записей до 20. Как сохранить мои 30 записей, а также включает детали из отдельных таблиц (если онисуществовать)?

Мой базовый оператор - тянет 30 записей

SELECT DISTINCT EMPLOYEE_NUM "Employee #", 
START_DATE "Start Date",
NAME "Employee Name"
FROM EMPLOYEES E
JOIN EMPLOYEE_DETAILS D ON D.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE D.START_DATE >= DATE '2016-12-14'
ORDER BY 1;

Выход Ex.

    Employee # | Start Date | Employee Name
    1234         12/15/2017   Jim Doe
    1456         01/16/2017   John Dillin
    5435         04/23/2017   Jane Mitchel
    9876         09/12/2017   Joan Smith
    7655         10/14/2017   Barry Gibb 
   ...25 more records

Подробное заявление о включении дополнительных полей - только 20 записей

SELECT DISTINCT EMPLOYEE_NUM "Employee #", 
START_DATE "Start Date",
NAME "Employee Name",
OS.ONBOARDING_LOCATION "On-boarding Location",
OS.COMPLETION_DATE "Completion Date"
FROM EMPLOYEES E
JOIN EMPLOYEE_DETAILS D ON D.EMPLOYEE_ID = E.EMPLOYEE_ID
JOIN ONBOARDING_STATUS OS ON OS.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE D.START_DATE >= DATE '2016-12-14'
AND OS.DESCRIPTION LIKE 'START'
AND OS.CANCELLED IS NULL
ORDER BY 1;

Пример вывода

    Employee # | Start Date | Employee Name | On-boarding Location | Completion Date
    1234         12/15/2017   Jim Doe           Sacramento, CA         12/13/2017
    1456         01/16/2017   John Dillin       Atlanta, GA            01/19/2017
    7655         10/14/2017   Barry Gibb        Los Angeles, CA        10/17/2017
   ...17 more records

Вот то, что я пытался сделать, ноон только дублирует записи:

SELECT DISTINCT EMPLOYEE_NUM "Employee #", 
START_DATE "Start Date",
NAME "Employee Name",
(CASE 
   WHEN OS.DESCRIPTION LIKE 'START' AND OS.CANCELLED IS NULL
   THEN OS.ONBOARDING_LOCATION
   ELSE NULL
END)"On-boarding Location",
(CASE 
   WHEN OS.DESCRIPTION LIKE 'START' AND OS.CANCELLED IS NULL
   THEN OS.COMPLETION_DATE
   ELSE NULL
END)"Completion Date"
FROM EMPLOYEES E
JOIN EMPLOYEE_DETAILS D ON D.EMPLOYEE_ID = E.EMPLOYEE_ID
JOIN ONBOARDING_STATUS OS ON OS.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE D.START_DATE >= DATE '2016-12-14'
ORDER BY 1;

Моя последняя попытка извлекает данные, но, похоже, не придерживается инструкции CASE WHEN и дублирует многие записи.Пожалуйста, дайте мне знать, если это не имеет смысла.Любая помощь или советы, которые вы можете предоставить, будут очень благодарны.

Заранее спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Используйте OUTER объединений, как в:

SELECT
    DISTINCT EMPLOYEE_NUM "Employee #", 
    START_DATE "Start Date",
    NAME "Employee Name",
    OS.ONBOARDING_LOCATION "On-boarding Location",
    OS.COMPLETION_DATE "Completion Date"
  FROM EMPLOYEES E
  left JOIN EMPLOYEE_DETAILS D ON D.EMPLOYEE_ID = E.EMPLOYEE_ID
   and D.START_DATE >= DATE '2016-12-14'
  left JOIN ONBOARDING_STATUS OS ON OS.EMPLOYEE_ID = E.EMPLOYEE_ID
   AND OS.DESCRIPTION LIKE 'START'
   AND OS.CANCELLED IS NULL
  ORDER BY 1;

Обратите внимание, что я переместил условия фильтрации (раздел WHERE) в предложения объединения для принудительного применения внешних объединений.Если вы сохраните фильтры в предложении WHERE, вы фактически преобразуете объединения в внутренние объединения, и вы не хотите этого делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...