кодесурса
«SQLite

Oracle Semijoins

script1adsense2code
script1adsense3code

Что такое полубоймы в Oracle?

Полусоединение между двумя таблицами возвращает строки, которые соответствуют подзапросу EXISTS без дублирования строк с левой стороны предиката, когда несколько строк с правой стороны удовлетворяют критериям подзапроса.

  • Полу-соединения пишутся с использованием EXISTS или IN.
  • Полусоединение может быть выполнено с использованием алгоритмов вложенных циклов, хеш-соединений или объединений слиянием.
  • Преобразование полусоединения и антисоединения невозможно, если подзапрос находится в ветви OR в предложении WHERE.

Разница между полусоединением и обычным соединением

Основное различие между полусоединением и обычным соединением заключается в том, что строки в таблице, расположенные слева от предиката, будут возвращены не более одного раза. Даже если правая часть таблицы предиката содержит два совпадения для строки в левой части таблицы предиката, будет возвращена только одна копия строки.

Пример таблицы: сотрудники


Пример таблицы: отделы


Пример: Полуосоединения Oracle

Следующая инструкция sql возвращает список отделов с хотя бы одним сотрудником.

SELECT   D.department_id, D.department_name
FROM departments D
WHERE EXISTS
(SELECT 1
FROM   employees E
WHERE  E.department_id = D.department_id)
ORDER BY D.department_id;

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

 DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
           10 Администрация
           20 Маркетинг
           30 Закупки
           40 человеческих ресурсов
           50 Доставка
           60 ИТ
           70 Связи с общественностью
           80 Продажи
           90 Executive
          100 финансов
          110 Бухгалтерский учет
11 строк выбрано. 

Приведенные выше результаты показывают, что ни один отдел не появляется более одного раза. Oracle прекращает обработку каждого отдела, как только первый сотрудник в этом отделе найден.

Вот запрос, если мы написали с обычным соединением:

Название отдела в следующем результате запроса будет отображаться столько раз, сколько сотрудников в нем. Так, например, если в отделе 20 сотрудников, то этот отдел будет появляться в результатах запроса 20 раз.

Чтобы исключить повторяющиеся строки, вы можете использовать ключевые слова DISTINCT или GROUP BY. Более элегантное решение состоит в использовании полусоединения между таблицами отделов и сотрудников вместо обычного соединения:

SELECT D.department_id, D.department_name
FROM departments D, employees E
WHERE E.department_id = D.department_id
ORDER BY D.department_id;

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

 DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------
           10 Администрация
           20 Маркетинг
           20 Маркетинг
           30 Закупки
           30 Закупки
           30 Закупки
           30 Закупки
           30 Закупки
           30 Закупки
           40 человеческих ресурсов
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
           50 Доставка
		   .........
		   .........

Приведенный выше пример показывает, что отдел с N сотрудниками появится в списке N раз. Чтобы исключить повторяющиеся строки, вы можете использовать ключевые слова DISTINCT или GROUP BY.

Пример - 2:

В следующем примере возвращается только одна строка, которую необходимо вернуть из таблицы отделов, хотя многие строки в таблице сотрудников могут соответствовать подзапросу. Если в столбце зарплаты сотрудников не определено ни одного индекса, то для повышения производительности запросов можно использовать полусоединение.

SELECT * FROM departments 
WHERE EXISTS 
(SELECT * FROM employees 
WHERE departments.department_id = employees.department_id 
AND employees.salary >= 3500);

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

 DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID
------------- ------------------------------ ------- --- -----------
           10 Администрация 200 1700
           20 Маркетинг 201 1800
           30 Закупка 114 1700
           40 людских ресурсов 203 2400
           50 Доставка 121 1500
           60 IT 103 1400
           70 Связи с общественностью 204 2700
           80 Продажа 145 2500
           90 Executive 100 1700
          100 финансов 108 1700
          110 Бухгалтерский учет 205 1700
11 строк выбрано.

Предыдущая: CROSS JOIN
Далее: ANTIJOINS

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code