USING (product_id)
INNER JOIN product_types pt
USING (product_type_id)
ORDER BY p.name;
Выполнение внутренних соединений по нескольким столбцам
с использованием SQL/92
Если в соединении используется более одного столбца из двух таблиц,
можно использовать эти столбцы во фразе ON вместе с оператором AND. Например,
нужно соединить две таблицы - t a b le l и table2, используя столбцы
columnl и column2 из обеих таблиц. Запрос может выглядеть следующим
образом:
□ SELECT . . .
FROM t a b le l INNER JOIN table2
ON t a b l e l . columnl = table2.columnl
AND t a b l e l . column2 = table2.column2;
Можно еще более упростить этот запрос, используя фразу USING, но
только в том случае, если выполняется соединение по эквивалентности,
а имена соединяемых столбцов одинаковы. В этом случае предыдущий запрос
можно переписать, используя фразу USING:
Выборка информации из таблиц базы данных 63
□ SELECT ...
FROM tablel INNER JOIN table2
USING (columnl, column2);
Выполнение внешних соединений с использованием SQL/92
Выше было показано, как выполняются внешние соединения, использующие
оператор внешнего соединения (+). Этот синтаксис является собственностью
Oracle. По стандарту SQL/92 для выполнения внешних соединений
используется другой синтаксис. Вместо использования оператора
(+) тип соединения указывается во фразе FROM оператора SELECT, используя
следующий синтаксис:
П FROM tablel {LEFT | RIGHT | FULL } OUTER JOIN table2
где
■ таблицы tablel и table2 определяют таблицы, которые нужно соединить;
■ ключевое слово LEFT указывает, что нужно выполнить левое внешнее
соединение;
■ ключевое слово RIGHT указывает, что нужно выполнить правое внешнее
соединение;
■ ключевое слово FULL указывает, что нужно выполнить полное внешнее
соединение; при полном внутреннем соединении используются
все строки таблиц tablel и table2, в том числе и те, где в столбцах,
используемых для соединения, имеются пустые (null) значения. При
использовании оператора (+) непосредственное выполнение полных
внешних соединений не разрешается.
Ниже вы увидите, как выполнять левое, правое и полное внешние соединения
с использованием синтаксиса SQL/92.
Выполнение левых внешних соединений
с использованием SQL/92
Ранее был представлен запрос, выполняющий левое внешнее соединение
при помощи собственного оператора Oracle (+):
□ SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_types_id (+)
ORDER BY p.name;
Следующий пример переписывает этот запрос, используя ключевые
слова SQL/92 LEFT OUTER JOIN:
□ SELECT p.name, pt.name
FROM products p LEFT OUTER JOIN product_types pt
USING(product_type_id)
ORDER BY p.name;
64 Глава 2
Выполнение правых внешних соединений с использованием
SQL/92
Ранее был представлен запрос, выполняющий правое внешнее соединение
при помощи собственного оператора Oracle (+):
□ SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id (+) = pt.produc t_type s_id
ORDER BY p.name;
Следующий пример переписывает этот запрос, используя ключевые
слова SQL/92 RIGHT OUTER JOIN:
□ SELECT p.name, pt.name
FROM products p RIGHT OUTER JOIN product_types pt
USING(product_type_id)
ORDER BY p.name;
Выполнение полных внешних соединений
с использованием SQL/92
При полном внешнем соединении используются все строки соединяемых
таблиц, включая и те, где в одном из соединяемых столбцов имеются пустые
значения. Следующий пример показывает запрос, использующий ключевые
слова SQL/92 FULL OUTER JOIN:
□ SELECT p.name, pt.name
FROM products p FULL OUTER JOIN product_types pt
USINGCP roduct_type_id)
ORDER BY p.name;
NAME NAME
2412: The Return Video
Chemistry Book
C la s s ic Music CD
Cre a t iv e Y e l l CD
From Another Planet DVD
Modern Science Book
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z F i le s Video
Magazine
Показаны обе строки: My Front Line из таблицы products и Magazine из
таблицы product_types.
Выполнение самосоединений с использованием SQL/92
В приведенном ниже примере SQL/86 используется для выполнения само-
соединения по таблице employees:
Выборка информации из таблиц базы данных 65
□ SELECT w.last_name || ' works fo r ' || m.last_name
FROM employees w, employees m
WHERE w.manager_id = m.employee_id;
Следующий пример переписывает этот запрос, чтобы в нем использовались
ключевые стола SQL/92 INNER JOIN и ON:
□ SELECT w.last_name || 1 works fo r ' || m.last_name
FROM employees w INNER JOIN employees m
ON w.manager_id = m.employee_id;
Выполнение перекрестных соединений
с использованием SQL/92
Пропуск условий соединения для двух таблиц приводит к возникновению
декартовых произведений. При использовании синтаксиса соединения
SQL/92 удается избежать случайного появления декартовых произведений,