Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л-8,9.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
101.38 Кб
Скачать

З’єднання таблиці з собою

Розглянемо можливість з’єднувати дві копії однієї таблиці. Коли відбувається з’єднання таблиці з собою, усі імена полів, що повторюються, заповнюються префіксами, які є іменем таблиці. Тому необхідно мати два імені для цієї таблиці. Це робиться за допомогою псевдонімів. Їх необхідно визначати у виразі 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, можна виконати відповідно ліве, праве, повне з’єднання і об’єднане з’єднання.