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つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
-
ALL
キーワードは、nested_table2
に存在せず、nested_table1
に存在するすべての要素を戻します。たとえば、ある特定の要素がnested_table1
でm
回、nested_table2
でn
回出現すると想定します。結果には、この要素は、m >n
の場合は(m-n)
回、m<=n
の場合は0(ゼロ)回出現します。ALL
はデフォルトです。 -
DISTINCT
キーワードは、出現回数にかかわらず、nested_table1
とnested_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つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
-
ALL
キーワードは、入力する2つのネストした表に存在するすべての共通要素を戻します(重複する共通の値や、重複する共通のNULL
も含まれます)。たとえば、ある特定の値がnested_table1
でm
回、nested_table2
でn
回出現する場合、結果には、この要素が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つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
-
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演算子を参照してください。