多集运算符将两个嵌套表的结果合并到一个嵌套表中。
与多集运算符相关的示例要求创建两个嵌套表并按如下方式加载数据:
首先, 制作一个名为customers_demo
的oe.customers
表的副本:
CREATE TABLE customers_demo AS SELECT * FROM customers;
接下来, 创建一个名为cust_address_tab_typ
的表类型。在创建嵌套表列时将使用此类型。
CREATE TYPE cust_address_tab_typ AS TABLE OF cust_address_typ; /
现在, 在customers_demo
表中创建两个嵌套表列:
ALTER TABLE customers_demo ADD (cust_address_ntab cust_address_tab_typ, cust_address2_ntab cust_address_tab_typ) NESTED TABLE cust_address_ntab STORE AS cust_address_ntab_store NESTED TABLE cust_address2_ntab STORE AS cust_address2_ntab_store;
最后, 使用oe.customers
表的cust_address
列中的数据将数据加载到两个新的嵌套表列中:
UPDATE customers_demo cd SET cust_address_ntab = CAST(MULTISET(SELECT cust_address FROM customers c WHERE c.customer_id = cd.customer_id) as cust_address_tab_typ); UPDATE customers_demo cd SET cust_address2_ntab = CAST(MULTISET(SELECT cust_address FROM customers c WHERE c.customer_id = cd.customer_id) as cust_address_tab_typ);
多集除了
MULTISET
集EXCEPT
作为参数两个嵌套表, 并返回一个嵌套表, 其元素位于第一个嵌套表中, 而不是在第二个嵌套表中。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。
插图 "multiset_except" 的说明
ALL
关键字指示 Oracle 返回不在nested_table2
中的nested_table1
中的所有元素。例如, 如果某个特定元素在nested_table1
和nested_table2
中发生m
次, 则结果将有n
(m-n)
如果m >n
和0出现的元素 (如果m<=n
) 发生。ALL
是默认值。DISTINCT
关键字指示 Oracle 消除nested_table1
中的任何元素, 它也在nested_table2
中, 无论发生的次数如何。嵌套表的元素类型必须是可比较的。有关标量类型的可比性的信息, 请参阅"比较条件" 。
例子
下面的示例对两个嵌套表进行比较, 并返回在第一个嵌套表中找到但不在第二个嵌套表中的那些元素的嵌套表:
SELECT customer_id, cust_address_ntab MULTISET EXCEPT DISTINCT cust_address2_ntab multiset_except FROM customers_demo ORDER BY customer_id; CUSTOMER_ID MULTISET_EXCEPT(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ----------- -------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP() 102 CUST_ADDRESS_TAB_TYP() 103 CUST_ADDRESS_TAB_TYP() 104 CUST_ADDRESS_TAB_TYP() 105 CUST_ADDRESS_TAB_TYP() . . .
前面的示例要求表customers_demo
和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。
多集相交
MULTISET
集INTERSECT
作为参数两个嵌套表, 并返回一个嵌套表, 其值在两个输入嵌套表中是常见的。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。
插图 "multiset_intersect" 的说明
ALL
关键字指示 Oracle 返回两个输入嵌套表中元素的所有常见匹配项, 包括重复的公共值和重复的常见NULL
事件。例如, 如果某个特定值在nested_table2
中nested_table1
和n
次中发生m
次, 则结果将包含元素min(m,n)
时间。ALL
是默认值。DISTINCT
关键字指示 Oracle 从返回的嵌套表中消除重复项, 包括如果存在则为NULL
的重复项。嵌套表的元素类型必须是可比较的。有关标量类型的可比性的信息, 请参阅"比较条件" 。
例子
下面的示例对两个嵌套表进行比较, 并返回在两个输入嵌套表中找到的这些元素的嵌套表:
SELECT customer_id, cust_address_ntab MULTISET INTERSECT DISTINCT cust_address2_ntab multiset_intersect FROM customers_demo ORDER BY customer_id; CUSTOMER_ID MULTISET_INTERSECT(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID ----------- ----------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US')) 102 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US')) 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US')) 104 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US')) 105 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US')) . . .
前面的示例要求表customers_demo
和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。
多集联盟
MULTISET
集UNION
采用两个嵌套表的参数, 并返回一个嵌套表, 其值为两个输入嵌套表中的一个。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。
插图 "multiset_union" 的说明
ALL
关键字指示 Oracle 返回两个输入嵌套表中的所有元素, 包括重复值和重复的NULL
事件。这是默认值。DISTINCT
关键字指示 Oracle 从返回的嵌套表中消除重复项, 包括如果存在则为NULL
的重复项。嵌套表的元素类型必须是可比较的。有关标量类型的可比性的信息, 请参阅"比较条件" 。
例子
下面的示例对两个嵌套表进行比较, 并从两个输入嵌套表中返回一个嵌套的元素表:
SELECT customer_id, cust_address_ntab MULTISET UNION cust_address2_ntab multiset_union FROM customers_demo ORDER BY customer_id; CUSTOMER_ID MULTISET_UNION(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ----------- ------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US'), CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US')) 102 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US'), CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN','US')) 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'), CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US')) 104 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US'), CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US')) 105 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US'), CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US')) . . .
前面的示例要求表customers_demo
和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。