Робота з множинами в transact-sql, бази даних, статті, програмування - програмування c,

Один з недоліків MS SQL Server (в порівнянні з ORACLE) - майже повна відсутність готових функцій для роботи з множинами (тут і далі маються на увазі унікальні безлічі, в яких немає повторюваних значень). Щоб, наприклад, отримати різницю двох множин (в ORACLE операція MUNUS), доводиться писати досить складні SQL виразу. При зміні операції (коли, замість (A - B) треба виконати (B - A)) вираз доводиться переписувати. А сконструювати вираз для 3 і більше множин - завдання зовсім не з простих.


Частини 1 і 2 розраховані на початківців.

Частина 1. Операції над множинами.

Спочатку домовимося, що розуміти під безліччю. Можна сказати, це таблиця з первинним ключем (з одного або багатьох стовпців). Нас зараз цікавить тільки цей ключ. Отже, рядки в кожній таблиці не повинні повторюватися.

Розглянемо наступний приклад: в Суботу та Неділю у Вас були гості:

висновок

Як Ви помітили, існують деякі закономірності.

Перетину множин завжди відповідає сума ідентифікаторів. Різниці - ідентифікатор від'ємника. Симетричною різниці - перерахування ідентифікаторів первинних множин. І т.д. Користуючись цими закономірностями, можна було б навіть написати якусь процедуру, щось типу калькулятора множин. Як параметр вона брала б імена таблиць і вираз, яке треба обчислити.

До переваг запропонованого способу можна віднести його легку «программируемость» в динамічному SQL. Особливо у випадках, коли заздалегідь не відомо, яку операцію доведеться виконувати. Зручно працювати з таблицями, що містять багато стовпців, так як не треба пов'язувати відповідні стовпці з різних таблиць, як при використанні JOIN.

Продуктивність способу поки не вимірювалася. Можливо, вона нижче, ніж з JOIN. Якщо хто виміряє, будь ласка, повідомте.

Необхідно ще раз відзначити, що вищеописані прийоми можна застосовувати тільки з множинами, де немає повторюваних значень.

Буду раз дізнатися Вашу думку.