Oracle объединяет
Что такое Antijoins в Oracle?
Анти-соединение между двумя таблицами возвращает строки из первой таблицы, где во второй таблице не найдено совпадений. Анти-объединения пишутся с использованием конструкций NOT EXISTS или NOT IN. Анти-объединение по сути является противоположностью полусоединению. Найти несогласованные данные между двумя таблицами лучше, чем использовать Anti-Join или не существует.
Когда использовать Anti-Join ?
- Анти-объединения доступны только при выполнении подзапроса NOT IN
- Если подзапрос «NOT IN» даст хотя бы одно значение NULL, тогда целое NOT IN будет ложным, и результаты не будут возвращены, но «NOT EXIST» будет считать NULL значением и возвращает значение.
- Подзапрос не должен быть коррелирован. то есть. Подзапрос не может содержать выражения в предложениях SELECT или WHERE, которые ссылаются на столбцы во внешнем запросе.
- Используйте анти-объединения, когда во внешнем запросе выбирается много строк.
Пример таблицы: сотрудники
Пример таблицы: отделы
Пример: Oracle присоединяется без использования объединения
В следующем примере возвращается список пустых отделов.
SELECT D1.department_id, D1.department_name
FROM departments D1
MINUS
SELECT D2.department_id, D2.department_name
FROM departments D2, employees E2
WHERE D2.department_id = E2.department_id
ORDER BY 1;
Пример вывода:
DEPARTMENT_ID DEPARTMENT_NAME ------------- ------------------------------ 120 казначейства 130 Корпоративный налог 140 Контроль и Кредит 150 Услуги для акционеров 160 преимуществ 170 Производство 180 Строительство 190 Договаривающихся 200 операций 210 IT Поддержка 220 NOC 230 IT Helpdesk 240 государственных продаж 250 розничных продаж 260 Рекрутинг 270 Заработная плата 16 строк выбрано.
Пример: Oracle присоединяется с помощью соединения
Вот код приведенного выше примера с использованием антисоединений. Здесь мы получим тот же результат.
SELECT D.department_id, D.department_name
FROM departments D
WHERE NOT EXISTS
(
SELECT 1
FROM employees E
WHERE E.department_id = D.department_id
)
ORDER BY D.department_id;
Пример вывода:
DEPARTMENT_ID DEPARTMENT_NAME ------------- ------------------------------ 120 казначейства 130 Корпоративный налог 140 Контроль и Кредит 150 Услуги для акционеров 160 преимуществ 170 Производство 180 Строительство 190 Договаривающихся 200 операций 210 IT Поддержка 220 NOC 230 IT Helpdesk 240 государственных продаж 250 розничных продаж 260 Рекрутинг 270 Заработная плата 16 строк выбрано.
Пример - 2:
В следующем примере выбирается список сотрудников со столбцами «Идентификатор сотрудника», «Имя», «Фамилия» и «Идентификатор задания», которые не входят в определенный набор отделов:
SELECT employee_id,first_name,last_name,job_id
FROM employees
WHERE department_id NOT IN
(SELECT department_id FROM departments
WHERE location_id = 1700);
Пример вывода:
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID ----------- -------------------- ------------------- ------ ---------- 202 Пэт Фай MK_REP 201 Майкл Хартштейн MK_MAN 107 Диана Лоренц IT_PROG 106 Валли Патабалла IT_PROG 105 Дэвид Остин IT_PROG 104 Брюс Эрнст IT_PROG 103 Александр Хунольд IT_PROG 204 Герман Баер PR_REP 179 Чарльз Джонсон SA_REP 177 Джек Ливингстон SA_REP 176 Джонатон Тейлор SA_REP 175 Алисса Хаттон SA_REP 174 Эллен Абель SA_REP 173 Сундита Кумар СА_РЕП 172 Элизабет Бейтс SA_REP 171 Уильям Смит SA_REP 170 Тайлер Фокс SA_REP 169 Харрисон Блум SA_REP 168 Лиза Озер СА_РЕП 167 Амит Банда SA_REP 166 Сундар Анд СА_РЕП 165 Дэвид Ли SA_REP ........
Предыдущий: SEMIJOINS
Далее: Oracle Home
Новый контент: Composer: менеджер зависимостей для PHP , R программирования