如何从嵌套表中选择特定行?

时间:2013-02-12 13:14:12

标签: sql oracle select oracle11g nested-table

我有一个看起来像这样的表:

 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行存在,如何编写查询以从嵌套表返回第三行?这是我想要获得的输出:

   100          1
   200          NULL
   300          NULL

Haeving以前从未使用嵌套表,我发现很难用我的查询。感谢。

1 个答案:

答案 0 :(得分:1)

您可以将分析与横向联接(unnesting of collection)一起使用:

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的行。

顺便说一下,由于嵌套表存储为行的无序集,因此无法保证顺序。