0

私はこのようなテーブルを持っています:

 CREATE
     OR
REPLACE
   TYPE subaccount_nt 
     IS TABLE OF VARCHAR2(30);

 CREATE
   TABLE my_table
       ( contract_id   NUMBER(38,0)
       , subaccount    SUBACCOUNT_NT );

サンプルデータは次のとおりです。

   100          [1000, 1, 2]
   200          [2000, NULL, 999]
   300          [3000]

3番目の行が存在する場合、ネストされたテーブルから3番目の行を返すクエリを作成するにはどうすればよいですか?これが私が取得しようとしている出力です:

   100          1
   200          NULL
   300          NULL

Haevingはこれまでネストされたテーブルを操作したことがなかったので、クエリをフォーラム化するのは非常に難しいと感じています。ありがとう。

4

1 に答える 1

1

横方向の結合(コレクションのネスト解除)で分析を使用できます。

SQL> SELECT contract_id, CASE WHEN rn = 2 THEN val END val
  2    FROM (SELECT t.contract_id, column_value val,
  3                 row_number() over(PARTITION BY t.contract_id ORDER BY 1) rn,
  4                 COUNT(*) over (PARTITION BY t.contract_id) cnt
  5            FROM my_table t,
  6                 TABLE(t.subaccount))
  7   WHERE rn = 2 OR cnt = 1;

   CONTRACT_ID VAL
-------------- ---
           100 1
           200 
           300 

これは、空の行をリストしませんsubaccount

ちなみに、ネストされたテーブルは順序付けされていない行のセットとして格納されるため、順序は保証されません。

于 2013-02-12T13:47:26.470 に答える