Здавалка
Главная | Обратная связь

Запити, що використовують з'єднання



Декартів добуток таблиць

З'єднання - це підмножини декартова добутку. Тому що декартів добуток n таблиць - це таблиця, що містить усі можливі рядки r, такі, що r є зчепленням якого-небудь рядка з першої таблиці, рядка з другої таблиці, ... і рядка з n-й таблиці (а ми вже навчилися виділяти за допомогою SELECT будь-яка підмножина реляційної таблиці), те залишилося лише з'ясувати, чи можна за допомогою SELECT одержати декартів добуток. Для одержання декартова добутку кількох таблиць треба указати у фразі FROM перелік таблиць, що перемножуються, а у фразі SELECT v усі їхні стовпці.

Так, для одержання декартова добутку Вид_блюд і Трапези треба видати запит

SELECT Вигляд_блюд.*, Трапези.*

FROM Вигляд_блюд, Трапези;

Еквіз'єднання таблиць

Якщо з декартова добутку забрати непотрібні рядки і стовпці, то можна одержати актуальні таблиці, що відповідають кожному з з'єднань.

Очевидно, що добір актуальних рядків забезпечується введенням у запит WHERE фрази, у якій установлюється відповідність між:

· кодами трапез (Т) у таблицях Меню і Трапези (Меню.Т = Трапези.Т),

· кодами видів блюд (У) у таблицях Меню і Вид_блюд (Меню.У = Вид_блюд.В),

· номерами блюд (БЛ) у таблицях Меню і Блюда (Меню.БЛ = Блюда.БЛ).

Такий скоректований запит буде мати вид:

SELECT Меню.*, Трапези.*, Вид_блюд.*, Блюда.*

FROM Меню, Трапези, Вид_блюд, Блюда

WHERE Меню.Т = Трапези.Т

AND Меню.У = Вид_блюд.В

AND Меню.БЛ = Блюда.БЛ;

Природне з'єднання таблиць

У эквисоединение таблиць увійдуть дублікати стовпців, по яких проводилося з'єднання (Т, В и БЛ). Для виключення цих дублікатів можна створити природне з'єднання тих же таблиць:

SELECT Т, У, БЛ, Трапеза, Вид, Блюдо, Основа, Вихід, Праця

FROM Меню, Трапези, Вид_блюд, Блюда

WHERE Меню.Т = Трапези.Т

AND Меню.У = Вид_блюд.В

AND Меню.БЛ = Блюда.БЛ;

Композиція таблиць

Для виключення всіх стовпців, по яких проводиться з'єднання таблиць, треба створити композицію

SELECT Трапеза, Вид, Блюдо, Основа, Вихід, Праця

FROM Меню, Трапези, Вид_блюд, Блюда

WHERE Меню.Т = Трапези.Т

AND Меню.У = Вид_блюд.В

AND Меню.БЛ = Блюда.БЛ;

 

З'єднання таблиць з додатковою умовою

При формуванні з'єднання створюється робоча таблиця, до якої застосовні всі розглянуті операції: добір потрібних рядків з'єднання (WHERE фраза), упорядкування одержуваного результату (ORDER BY фраза) і агрегатування даних (SQL-функції і GROUP BY фраза).

Наприклад, для одержання переліку блюд, пропонованих у меню на сніданок, можна сформувати запит на основі композиції:

SELECT Вид, Блюдо, Основа, Вихід, 'Номер -', БЛ

FROM Меню, Трапези, Вид_блюд, Блюда

WHERE Меню.Т = Трапези.Т

AND Меню.У = Вид_блюд.В

AND Меню.БЛ = Блюда.БЛ

AND Трапеза = 'Сніданок';

 

З'єднання таблиці зі своєю копією. Використання імен кореляції (аліасів, псевдонімів)

У ряді додатків виникає необхідність одночасної обробки даних якої-небудь таблиці й однієї чи кількох її копій, створюваних на час виконання запиту.

Наприклад, при створенні списків студентів (таблиця Студенти) можливий повторне введення даних про якого-небудь студента з присвоєнням йому другого номера залікової книжки. Для виявлення таких помилок можна з'єднати таблицю Студенти з її тимчасовою копією, установивши в WHERE фразі рівність значень всіх однойменних стовпців цих таблиць крім стовпців з номером залікової книжки (для останніх треба установити умову нерівності значень).

Тимчасову копію таблиці можна сформувати, вказавши ім'я псевдоніма за ім'ям таблиці у фразі FROM. Так, за допомогою фрази

FROM Блюда X, Блюда Y, Блюда Z

будуть сформовані три копії таблиці Блюда з іменами X, Y і Z.

Тобто. доводиться виконувати запити, у яких таблиця з'єднується сама із собою, чи одна таблиця з'єднується двічі з іншою таблицею. При цьому використовуються імена кореляції (аліаси, псевдоніми), що дозволяють розрізняти копії таблиць, що з'єднуються. Імена кореляції вводяться в розділі FROM і йдуть через пробіл після імені таблиці. Імена кореляції повинні використовуватися як префікс перед іменем стовпця і відокремлюються від імені стовпця крапкою. Якщо в запиті вказуються ті самі поля з різних екземплярів однієї таблиці, вони повинні бути перейменовані для усунення неоднозначності в іменуваннях стовпчиків результуючої таблиці. Визначення імені кореляції діє тільки під час виконання запиту.

Як приклад з'єднання таблиці з нею самої сформуємо запит на вивід таких пар блюд таблиці Блюда, у яких збігається основа, а назва першого блюда пари менше (за алфавітом), чим номер другого блюда пари. Для цього можна створити запит з однією копією таблиці Блюда (Копія):

SELECT Блюдо, Копія.Блюдо, Основа

FROM Блюда, Блюда Копія

WHERE Основа = Копія.Основа

AND Блюдо < Копія.Блюдо;

чи двома її копіями (Перша і Друга):

SELECT Перша.Блюдо, Друга.Блюдо, Основа

FROM Блюда Перша, Блюда Друга

WHERE Перша.Основа = Друга.Основа

AND Перша.Блюдо < Друга.Блюдо;

Приклад. Відібрати усі пари постачальників таким чином, щоб перший постачальник у парі мав статус, більша статусу другого постачальника:

SELECT

P1.PNAME AS PNAME1,

P1.PSTATUS AS PSTATUS1,

P2.PNAME AS PNAME2,

P2.PSTATUS AS PSTATUS2

FROM

P P1, P P2

WHERE P1.PSTATUS1 > P2.PSTATUS2;

В результаті одержимо наступну таблицю:

PNAME1 PSTATUS1 PNAME2 PSTATUS2
Іванов Петров
Іванов Сидоров
Сидорук Петров


 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.