В Oracle поддерживается несколько типов соединений, отличающихся способом, которым производится объединение строк из двух или более таблиц или представлений. В этой заметке моего блога будут описаны типы соединений, применяемые в Oracle наиболее часто.
Эквисоединение
При эквисоединении (equi-join) две или более таблиц соединяются на основании условия равенства между столбцами. Другими словами, один и тот же столбец имеет одинаковое значение во всех соединяемых таблицах. Ниже приведен пример применения эквисоединения:
SQL> SELECT e.last_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;
Для показанного выше оператора соединения также можно использовать и следующий новый синтаксис:
SQL> SELECT e.last_name, d.dept FROM emp e JOIN dept d USING (emp_id);
При желании соединить несколько столбцов, можно перечислить их имена в виде разделенного запятыми списка, например: USING
(dept_id
, emp_name
).
Естественное соединение
Естественным соединением (natural join) называется эквисоединение, при котором столбцы, которые должны сопоставляться для выполнения соединения, специально не указываются. Oracle автоматически определяет подлежащие соединению столбцы на основании совпадающих столбцов в двух таблицах. Ниже приведен пример применения естественного соединения:
SQL> SELECT e.last_name, d.dept FROM emp e NATURAL JOIN dept d;
В этом примере условием для выполнения соединения служит наличие идентичных значений в столбце last_name
в таблицах emp
и dept
.
Рефлексивное соединение
Под рефлексивным соединением (self join) подразумевается соединение таблицы с самой собой за счет использования псевдонимов. В следующем примере осуществляется соединение таблицы employees
с самой собой при помощи псевдонима с удалением всех дублированных строк.
SQL> DELETE FROM employees X WHERE ROWID > 2 (select MIN(rowid) FROM employees Y 3 where X.key_values = Y.key_values);
Внутреннее соединение
Внутреннее соединение (inner join), также называемое простым соединением (simple join), предусматривает возврат всех строк, которые удовлетворяют указанному условию соединения. Раньше в синтаксисе внутреннего соединения для указания того, каким образом должны соединяться таблицы, нужно было использовать конструкцию WHERE
, например, так:
SQL> SELECT e.flast_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;
Теперь Oracle позволяет задавать критерии соединения в синтаксисе внутреннего (или простого) соединения за счет применения новой конструкции ON
или USING
, например:
SQL> SELECT DISTINCT NVL(dname, 'No Dept'), COUNT(empno) nbr_emps FROM emp JOIN DEPT ON emp.deptno = dept.deptno WHERE emp.job IN ('MANAGER', 'SALESMAN', 'ANALYST') GROUP BY dname;
Внешнее соединение
Внешнее соединение (outer join) применяется для возврата всех строк, которые удовлетворяют указанному условию соединения, плюс некоторых или всех строк из таблицы, в которой нет подходящих строк, удовлетворяющих указанному условию соединения. Существуют три вида внешнего соединения: левое внешнее соединение (left outer join), правое внешнее соединение (right outer join) и полное внешнее соединение (full outer join). В операторе полного внешнего соединения слово OUTER
обычно опускается.
Oracle позволяет использовать операцию внешнего соединения, подразумевающую применение знака плюс (+) для обозначения недостающих значений в одной таблице, но рекомендует лучше использовать вместо нее более новый синтаксис соединения ISO/ANSI. Ниже приведен пример типичного запроса с оператором полного внешнего соединения:
SQL> SELECT DISTINCT NVL(dept_name, 'No Dept') deptname, COUNT(empno) nbr_emps FROM emp FULL JOIN dept ON dept.deptno = emp.deptno GROUP BY dname;