Работа с мультимножествами в SQL
1) Создание мультимножеств
MULTISET [<перечисление>]|MULTISET(<запрос>)|TABLE(<запрос>)
Пример:
MULTISET[14, 16, 17]
MULTISET(SELECT SNum FROM SalesPeople)
2) Предикаты сравнения мультимножеств
{=|<>|MEMBER|SUBMULTISET|IS A SET} — сравнение по равенству, неравенству, вхождение значения в мультимножество или одного мультимножества в другое и есть ли в нем дубликаты.
3) Операции над мультимножествами
{UNION|INTERSECT|EXCEPT} [DISTINCT|ALL] – операции объединения, пересечения и определения разности. Каждая из операций может выполняться с сохранением ALL или с исключением DISTINCT дубликатов.
4) Функции над мультимножествами
{CAST|SET|CARDINALITY|ELEMENT} – преобразование типов мультимножества, удаление дубликатов, определение числа элементов в мультимножестве, выборка элемента мультимножества из одного элемента.
5) Агрегатные функции
{COLLECT|FUSHION|INTERSECT} (<столбец>) – создание мультимножества из значений поля, объединение мультимножеств поля в пересечение мультимножеств поля для всех выбранных строк.
Пусть есть таблица MultiTab:
SName | Set_CName (обслуживаемые покупатели) |
Peel | MULTISET[‘Hoffman’, ‘Clemens’, ‘Grass’] |
Serres | MULTISET[‘Lui’, ‘Grass’, ‘Pereira’] |
Rifkin | MULTISET[‘Cisneros’, ‘Giovanni’, ‘Grass’] |
Пример на агрегатные функции:
SELECT COLLECT(SName) AS ALL_SName FUSION(Set_CName) AS ALL_CName, INTERSECT(Set_CName) AS COMMON_CName FROM MultiTab
В результате выполнения этого запроса будет получена таблица с одной строкой, все три столбца которой содержат значения мультимножества:
ALL_SName | ALL_CName | COMMON_CName |
MULTISET[‘Peed’, ‘Serres’, ‘Rifkin’] | MULTISET[‘Hoffman’, ‘Clemens’, ‘Grass’, ‘Lui’, ‘Grass’, ‘Pereira’, ‘Cisneros’, ‘Giovanni’, ‘Grass’] | MULTISET[‘Grass’] |
6) Операции преобразования мультимножеств
UNNSET (<мультимножество>) AS <таблица>
Пример:
SELECT T.SNum, T.SNum+1000 AS New_SNum FROM UNNSET (MULTISET[1001, 1002, 1003]) AS T(SNum)
В результате выполнения этого запроса будет получена таблица:
SNum | New_SNum |
1001 | 2001 |
1002 | 2002 |
1003 | 2003 |