Використання злиттів

Злиття функціонально відрізняється від обєднання У термінах реляційної алгебри злиття є складанням, в той час як обєднання – множенням Замість розширення рядків по горизонталі, як це робить обєднання, злиття накладає один на одного кілька результуючих наборів даних, формуючи одну довгу таблицю (рис 913) При проектуванні запитів злиття потрібно слідувати деяким правилам

■ Імена стовпців або псевдонімів повинні бути визначені в першу інструкції SELECT

■ Всі інструкції SELECT повинні мати однакову кількість стовпців, і кожна лінійка стовпців повинна використовувати типи даних з одного сімейства

■ В інструкції SELECT можна додавати вирази, що визначають джерело рядків, якщо даний стовпець включений в усі інструкції SELECT

■ Злиття можна використовувати як частину інструкції SELECT INTO (цю форму дієслова вставки ми докладно розглянемо в главі 16), однак ключове слово INTO має перебувати в першому інструкції SELECT

■ Якщо для інструкції SELECT за замовчуванням визначено всі безліч рядків (ALL) і не визначено інше, то для злиття можна стверджувати зворотне Результатом злиття є унікальні рядки Якщо ви хочете змінити цей режим, слід явно вказати ключове слово ALL

■ Пропозиція ORDER BY сортує результати всіх операторів SELECT, однак при цьому використовує імена стовпців з першої інструкції SELECT

У наступному запиті злиття пропозицію ORDER BY звертається до колонку Thingl перший інструкції SELECT:

SELECT OnePK, Thingl, з таблиці One1 as Source

FROM dboOne UNION ALL

SELECT TwoPK, Thing2, з таблиці Two

FROM dboTwo ORDER BY Thingl

Результуючий набір даних використовує імена стовпців з першої інструкції SELECT: OnePK Thingl Source

4 Blue Thing з таблиці One

3 Car з таблиці Two

4 Cycle з таблиці Two

2 New Thing з таблиці One 1 Old Thing з таблиці One

1 Plane з таблиці Two

3 Red Thing з таблиці One

2 Train з таблиці Two

Злиття не обмежені лише двома таблицями – особисто мені одного разу доводилося працювати з 90 таблицями (згодом такий подвиг я більше не повторював) Насправді загальна кількість таблиць, на які посилається запит, може доходити до 256, і SQL Server успішно справляється з таким навантаженням

Злиття перетину

Злиття перетину шукає рядки, спільні для обох наборів даних Внутрішнє обєднання шукає відповідності по горизонталі, а злиття перетину – по вертикалі SQL Server не розглядає перетин і різниця як рідні операції, тому вони кілька збільшують навантаження Щоб підготувати базис для прикладу, спочатку доповнимо таблицю Two двома рядками, що створюють перетин:

INSERT dboTwo(TwoPK, OnePK, Thing2)

VALUES(5,0, Red Thing)

INSERT dboTwo(TwoPK, OnePK, Thing2)

SELECT Thingl FROM dboOne INTERSECT SELECT Thing2 FROM dboTwo ORDER BY Thingl

Результат буде наступним:

Thingl

Blue Thing Red Thing

Запит злиття перетину аналогічний внутрішньому обєднанню в ньому кожен стовпець бере участь в умові ON Проте запит злиття перетину відображає порожні значення як загальні і включає такі рядки в перетин, в той час як внутрішнє обєднання трактує порожні значення як різні і не повязує два рядки, що містять їх

Ключові слова intersect і except вперше зявилися у версії SQL Server 2005 Незважаючи на те що отримати коректні результати для злиттів перетину і різниці можна було і у версії SQL Server 2000, в програмах доводилося вдаватися до обхідних маневрів

Злиття різниці / Except

Злиття різниці аналогічно злиттю перетину, однак обмеження HAVING виявляє тільки ті рядки, які існують тільки в одному з двох наборів даних

Злиття різниці аналогічно запитом на різницю множин в тому, що шукає всі рядки, які присутні в одному наборі даних, але відсутні в іншому У той час як запит на різницю множин цікавиться тільки умовами обєднання (зазвичай між первинним і зовнішнім ключами) і обєднує рядки по горизонталі, злиття різниці дивиться на рядки в цілому (точніше, на всі стовпці, що беруть участь в інструкціях злиття SELECT) по вертикалі

SQL Server 2005 для виконання злиття різниці використовує ключове слово EXCEPT стандарту ANSI:

SELECT Thingl FROM dboOne EXCEPT

SELECT Thing2 FROM dboTwo ORDER BY Thingl

Результат буде наступним:

Thingl

New Thing Old Thing

Резюме

Обєднання даних лежить в самому серці мови SQL Воно розкриває всю глибину реляційної алгебри, так само як силу і гнучкість SQL За допомогою різних засобів, від природних обєднань і до корельованих підзапитів, SQL відмінно справляється з витяганням даних з численних джерел Основним завданням розробника додатків для SQL Server є освоєння теорії реляційної алгебри і численних засобів мови Т-SQL, і це дозволить йому ефективно маніпулювати даними Нагородою буде отримане задоволення

Незважаючи на те що зявилися технології NET і CLR, маніпулювання даними за допомогою операторів SELECT залишається ключовою технологією SQL Server І хоча обєднання є більш природним методом роботи з реляційними даними, підзапити відкривають численні можливості реалізації творчого підходу до вилучення даних з безлічі джерел

У наступному розділі ми розглянемо ряд способів використання підзапитів в тілі запиту Там же буде представлена ​​нова функція SQL Server – загальні табличні вирази (ETS)

Включення даних за допомогою підзапитів й скло

Реальна сила мови SQL проявляється в його здатності комбінувати різні методи вилучення даних Саме це дає можливість втілювати складні запити в коді для виконання завдань, які не можна виконати за допомогою графічного інструментарію Уміння використовувати ці кошти відрізняє справжнього професіонала від новачка Тому без вагань я вітаю ваше бажання вивчити прості і корельовані підзапити, керовані таблиці і загальні табличні вирази, а потім застосувати ці компоненти запиту для вирішення складних реляційних завдань, таких як реляционное поділ

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*