Выбрать главу

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 удается избежать случайного появления декартовых произведений,