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]

如果第三行存在,我如何编写查询以从嵌套表中返回第三行?这是我想要得到的输出:

   100          1
   200          NULL
   300          NULL

以前从未使用过嵌套表,我发现很难对我的查询进行论坛。谢谢。

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 回答