Естественным соединением таблиц
называется такое соединение, из которого исключены дубликаты столбцов,
по которым проводилось эквисоединение (Managers.Man_id и
Contracts.Man_id). Для исключения дубликатов в операторе SELECT
необходимо явно указать только один из столбцов этих пар, принадлежащего
главной таблице:
SELECT Managers.Man_id, D_id, Name, Hire_Date, Procent,
Comments, Parent_id, DayFrom, DayTo
FROM Managers, Contracts
WHERE Managers.Man_id = Contracts.Man_id;
Соединение таблиц с дополнительным условием
Наравне
с уловными выражениями, предназначенными для указания способа
соединения таблиц между собой, в параметре WHERE можно дополнительно
указывать все описанные выше дополнительные условия фильтрации,
объединенные с условными выражениями соединения при помощи оператора
AND. Например:
-- получение информации о менеджерах и заключенных
-- ими контрактах за последнюю неделю
SELECT Name, DayFrom, DayTo
FROM Managers, Contracts
WHERE Managers.Man_id = Contracts.Man_id
AND DayFrom BETWEEN TRUNC(SYSDATE)-7 AND SYSDATE;
Внутреннее и внешнее объединение таблиц
Ранее
были рассмотрены способы получения связанных между собой данных,
находящихся в нескольких таблицах, при помощи комбинирования операций
декартово произведения и горизонтальной фильтрации строк получившегося
набора данных.
Кроме этого во многих СУБД существуют реализации
операции внутреннего и внешнего условных соединений таблиц внутри одного
запроса – INNER JOIN (внутреннее объединение), LEFT JOIN (полное левое
объединение) и RIGHT JOIN (полное правое объединение).
Синтаксис применения операция объединения выглядит следующим образом:
SELECT список_полей
FROM таблица1 ( INNER | LEFT | RIGHT ) JOIN таблица2
ON таблица1.связующее_поле = таблица2.связующее_поле;
В
результате выполнения внутреннего объединения из кортежей двух
объединяемых таблиц остаются только те, для которых выполняется
указанное условие. Например:
-- получение имен менеджеров и связанных с ними дилеров
-- (менеджеры, не связанные с дилерами и дилеры не связанные
-- с менеджерами исключатся из результата)
SELECT Managers.Name, Dealers.Name
FROM Managers INNER JOIN Dealers
ON Managers.D_id=Dealers.D_id;
При полном (внешнем) левом объединении
из кортежей двух объединяемых таблиц остаются все кортежи таблицы,
указанной слева от условного выражения, и кортежи правой таблицы, для
которых выполняется указанное условие. Например:
-- получение всех менеджеров и связанных с ними дилеров,
-- включая менеджеров, не связанных с дилерами
SELECT Managers.Name, Dealers.Name
FROM Managers LEFT JOIN Dealers
ON Managers.D_id=Dealers.D_id;