ORACLE官方SQL语言参考笔记之运算符(第四章-第六节-多集操作员)

多集运算符将两个嵌套表的结果合并到一个嵌套表中。

与多集运算符相关的示例要求创建两个嵌套表并按如下方式加载数据:

首先, 制作一个名为customers_demooe.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);

多集除了

MULTISETEXCEPT作为参数两个嵌套表, 并返回一个嵌套表, 其元素位于第一个嵌套表中, 而不是在第二个嵌套表中。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。

Description of multiset_except.gif follows
插图 "multiset_except" 的说明

  • ALL关键字指示 Oracle 返回不在nested_table2中的nested_table1中的所有元素。例如, 如果某个特定元素在nested_table1nested_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和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。

多集相交

MULTISETINTERSECT作为参数两个嵌套表, 并返回一个嵌套表, 其值在两个输入嵌套表中是常见的。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。

Description of multiset_intersect.gif follows
插图 "multiset_intersect" 的说明

  • ALL关键字指示 Oracle 返回两个输入嵌套表中元素的所有常见匹配项, 包括重复的公共值和重复的常见NULL事件。例如, 如果某个特定值在nested_table2nested_table1n次中发生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和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。

多集联盟

MULTISETUNION采用两个嵌套表的参数, 并返回一个嵌套表, 其值为两个输入嵌套表中的一个。两个输入嵌套表的类型必须相同, 返回的嵌套表的类型也相同。

Description of multiset_union.gif follows
插图 "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和两个包含数据的嵌套表列。请参阅"多集运算符" 以创建此表和嵌套表列。

猜你喜欢

转载自blog.csdn.net/huyingzuo/article/details/80475962