З’єднання таблиці з собою
Розглянемо можливість з’єднувати дві копії однієї таблиці. Коли відбувається з’єднання таблиці з собою, усі імена полів, що повторюються, заповнюються префіксами, які є іменем таблиці. Тому необхідно мати два імені для цієї таблиці. Це робиться за допомогою псевдонімів. Їх необхідно визначати у виразі FROM. Псевдоніми використовуються і у виразі SELECT (перед їх визначенням) у вигляді префікса назви поля. Це допускається тому, що спочатку виконується вираз FROM, а потім SELECT. Псевдонім існує тільки тоді, коли виконується команда. Коли запит закінчено, то псевдоніми не мають вже ніякого значення.
Наприклад, знайдемо усі пари замовників, які мають однаковий рейтинг:
SELECT first.cname, second.cname, first.rating
FROM Customers first, Customers second
WHERE first.rating=second.rating;
Або SELECT first.cname, second.cname, first.rating
FROM Customers first JOIN Customers second
ON first.rating=second.rating;
Тут використовується з’єднання за іменами стовпців:
SELECT first.cname, second.cname, first.rating
FROM Customers first JOIN Customers second
USING (first.rating,second.rating);
При виводі результату нашого прикладу буде два значення для кожної комбінації, причому другий раз в оберненому вигляді. Таким чином, у прикладі Hoffman вибрався разом з Clemens, а потім Clemens вибрався з Hoffman і т.п. Крім того, кожен рядок порівнюється з собою і виводяться однакові імена, наприклад, Liu і Liu. Простий спосіб уникнути цього – зробити асиметричний предикат, щоб значення в оберненому порядку не виводились. Наприклад:
SELECT first.cname, second.cname, first.rating
FROM Customers first, Customers second
WHERE first.rating=second.rating
AND first.cname<second.cname;
Або SELECT first.cname, second.cname, first.rating
FROM Customers first JOIN Customers second
ON first.rating=second.rating
AND first.cname<second.cname;
В цьому випадку Hoffman передує Periera в алфавітному порядку, тому така комбінація задовольняє обидві умови предиката і з’являється при виводі. Коли ж така комбінація зустрічається в оберненому порядку – коли Periera порівнюється з Hoffman, то така комбінація не задовольняє другій умові. Не виводяться і однакові імена, бо стоїть знак <, а не <=.
Перехресне з’єднання (cross join)
Перехресне з’єднання в стандарті ANSI SQL відповідає операції розширеного декартового добутку, тобто операції з’єднання двох таблиць, при якому кожний запис першої таблиці з’єднується з кожним записом другої таблиці.
Наприклад, отримаємо декартів добуток таблиці самої на себе. Використаємо псевдоніми:
SELECT <список стовпців>
FROM Таблиця1 Т1, Таблиця2 Т2;
Або SELECT <список стовпців>
FROM Таблиця1 Т1 CROSS JOIN Таблиця2 Т2$
Зауважимо, що в деяких СУБД не допускається використання оператора CROSS JOIN.
Зовнішні з’єднання.
З таблиці при внутрішньому з’єднанні відкидаються усі записи, для яких немає відповідних записів одночасно в обох таблицях. При зовнішньому об’єднанні такі невідповідні записи повинні залишатись. У цьому і полягає відмінність внутрішнього і зовнішнього об’єднання.
За допомогою спеціальних ключових слів LEFT OUTER, RIGHT OUTER, FULL та UNION, написаних перед JOIN, можна виконати відповідно ліве, праве, повне з’єднання і об’єднане з’єднання.
