我有一个看起来像这样的表:
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以前从未使用嵌套表,我发现很难用我的查询。感谢。
答案 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
的行。
顺便说一下,由于嵌套表存储为行的无序集,因此无法保证顺序。