プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

MULTISET演算子

MULTISET演算子は、2つのネストした表の結果を1つのネストした表にまとめます。

MULTISET演算子に関する例では、次のように2つのネストした表を作成し、データをロードする必要があります。

まず、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表に、ネストした表の列を2つ作成します。

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列のデータを使用して、2つの新しいネストした表の列にデータをロードします。

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は、引数として2つのネストした表を取り、1つ目のネストした表に存在し、2つ目のネストした表に存在しない要素を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。

multiset_except.gifの説明が続きます。
図「multiset_except.gif」の説明

  • ALLキーワードは、nested_table2に存在せず、nested_table1に存在するすべての要素を戻します。たとえば、ある特定の要素がnested_table1m回、nested_table2n回出現すると想定します。結果には、この要素は、m >nの場合は(m-n)回、m<=nの場合は0(ゼロ)回出現します。ALLはデフォルトです。

  • DISTINCTキーワードは、出現回数にかかわらず、nested_table1nested_table2の両方に存在するすべての要素を排除します。

  • ネストした表の要素型は比較可能なものである必要があります。スカラー型以外の型の比較の可能性は、「比較条件」を参照してください。

次の例では、2つのネストした表を比較し、1つ目のネストした表に存在し、2つ目のネストした表に存在しない要素を持つネストした表を戻します。

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と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。

MULTISET INTERSECT

MULTISET INTERSECTは、引数として2つのネストした表を取り、入力する2つのネストした表に共通する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。

multiset_intersect.gifの説明が続きます。
図「multiset_intersect.gif」の説明

  • ALLキーワードは、入力する2つのネストした表に存在するすべての共通要素を戻します(重複する共通の値や、重複する共通のNULLも含まれます)。たとえば、ある特定の値がnested_table1m回、nested_table2n回出現する場合、結果には、この要素がmin(m,n)回出現します。ALLはデフォルトです。

  • DISTINCTキーワードは、戻されるネストした表から重複を排除します(重複するNULLが存在する場合、これも排除されます)。

  • ネストした表の要素型は比較可能なものである必要があります。スカラー型以外の型の比較の可能性は、「比較条件」を参照してください。

次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。

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と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。

MULTISET UNION

MULTISET UNIONは、引数として2つのネストした表を取り、入力する2つのネストした表に存在する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。

multiset_union.gifの説明が続きます。
図「multiset_union.gif」の説明

  • ALLキーワードは、入力する2つのネストした表に存在するすべての要素を戻します(重複する値や、重複するNULLも含まれます)。これはデフォルトです。

  • DISTINCTキーワードは、戻されるネストした表から重複を排除します(重複するNULLが存在する場合、これも排除されます)。

  • ネストした表の要素型は比較可能なものである必要があります。スカラー型以外の型の比較の可能性は、「比較条件」を参照してください。

次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。

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と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。