Если в таблице содержатся иерархические данные (данные, которые могут быть сгруппированы в уровни с размещением родительских данных на более высоких, а дочерних — на более низких уровнях), можно использовать поддерживаемые Oracle иерархические запросы. В иерархических запросах обычно применяются следующие конструкции:
START WITH
, которая обозначает корневую строку или строки иерархического отношения;CONNECT BY
, которая задает отношения между родительскими и дочерними строками вместе с операцийPRIOR
, которая всегда указывает на родительскую строку.
В листинге ниже приведен пример иерархического отношения между столбцами сотрудников и менеджеров. Конструкция CONNECT BY
указывает, как должно выглядеть это отношение, а конструкция START WITH
— с какого места оператору следует начинать отслеживать иерархию.
SQL> SELECT employee_id, last_name, manager_id FROM employees START WITH manager_id = 100 CONNECT BY PRIOR employee_id = manager_id; EMPLOYEE_ID LAST_NAME MANAGER_ID ----------- -------------- ---------- 101 Reddy 100 108 Greenberg 101 109 Faviet 108 110 Colon 108 111 Chowdhary 108 112 Urman 108 113 Singh 108 200 Whalen 101 SQL>
Выбор данных из нескольких таблиц
До сих пор главным образом показывалось, как выполнять различные DML-операции в отношении одиночных таблиц, в том числе с применением различных SQL-функций и выражений. В реальной жизни, однако, чаще всего требуется извлекать данные не из одной, а сразу из нескольких таблиц или представлений. При извлечении данных из нескольких таблиц, таблицы необходимо соединять (join). Под соединением подразумевается запрос, который позволяет объединять данные из таблиц, представлений и материализованных представлений. Следует отметить, что таблица может соединяться как с другими таблицами, так и сама с собой.
Соединение двух таблиц без использования сужающей выбор конструкции WHERE
называется декартовым произведением (Cartesian product) или декартовым соединением (Cartesian join). При таком соединении, следовательно, вывод запроса будет содержать все строки из обеих таблиц. Ниже приведен пример декартового соединения:
SQL> SELECT * FROM employees, dept;
Декартово произведение двух больших таблиц практически всегда является результатом выполнения ошибочного SQL-запроса, в котором было пропущено условие соединения (join condition). За счет использования условия соединения при объединении данных из двух или более таблиц можно ограничивать количество возвращаемых строк. Это условие можно применять в конструкции WHERE
или FROM
и тем самым указывать, что извлекаться должны только те данные, которые удовлетворяют описанному в условии соединения условию.
Ниже приведен пример использования условия соединения в операторе соединения:
SQL> SELECT * FROM employees, dept WHERE dept='HR';