Oracle 10g 引入 Advanced Multiset 運算符,彌補 8i 時代嵌套表操作的不足。先建立嵌套表類型與儲存表:
CREATE OR REPLACE TYPE num_tab_typ AS TABLE OF NUMBER;
/
CREATE TABLE num_tab (num num_tab_typ)
NESTED TABLE num STORE AS num_tab_store;
插入三組測試資料:(1,2,3,4,5)、(1,3,5)、(2,4,6)。
| 運算符 | 語法範例 | 語義 | 結果說明 |
|---|---|---|---|
MULTISET EXCEPT | num MULTISET EXCEPT num_tab_typ(1) | 差集 | 移除右側集合出現的元素(僅移除一次),保留左側剩餘元素。 |
MULTISET INTERSECT | num MULTISET INTERSECT num_tab_typ(1) | 交集 | 僅保留雙方都存在的元素(重複元素按最小出現次數)。 |
MULTISET UNION | num MULTISET UNION num_tab_typ(1) | 聯集(含重複) | 合併雙方所有元素,重複值保留。 |
MULTISET UNION DISTINCT | num MULTISET UNION DISTINCT num_tab_typ(1) | 聯集(去重) | 合併後移除重複值。 |
關鍵行為:所有運算符均按「多重集」語義,即重複元素視為獨立個體,運算時逐一配對移除或保留。
num = num_tab_typ(1,3,5) 忽略順序,僅比較元素組成與個數;(1,1,3,5) ≠ (1,3,5)。| 子句/函數 | 用途 | 範例 |
|---|---|---|
IS A SET | 判斷是否無重複元素(即為集合) | num IS A SET、num MULTISET UNION num_tab_typ(1) IS A SET |
SET() | 移除重複元素,轉為集合 | SET(num) |
IS EMPTY | 判斷是否為空集合 | num MULTISET INTERSECT num_tab_typ(1) IS EMPTY |
MEMBER OF / NOT MEMBER OF | 判斷標量值是否屬於嵌套表 | 3 MEMBER OF num |
SUBMULTISET OF | 判斷左側嵌套表是否為右側多重集的子集 | num_tab_typ(1,3,5) SUBMULTISET OF num |
POWERMULTISET(expr):回傳給定多重集的所有子集(以嵌套表的嵌套表型別呈現)。POWERMULTISET_BY_CARDINALITY(expr, n):僅回傳元素個數為 n 的子集。-- 以 (2,4,6) 為例
POWERMULTISET → {(2),(4),(2,4),(6),(2,6),(4,6),(2,4,6)}
POWERMULTISET_BY_CARDINALITY(..., 2) → {(2,4),(2,6),(4,6)}
多重集運算符讓 SQL 直接處理集合邏輯,適用於標籤系統、權限矩陣、資料去重與集合代數運算等場景,避免將資料取出至應用層處理,提升效能與開發效率。結合 IS A SET、MEMBER OF 等判斷子句,可在 SQL 中完整表達複雜的集合關係邏輯。