【问题标题】:How can I select a particular row from a nested table? [duplicate]如何从嵌套表中选择特定行? [复制]
【发布时间】:2013-01-27 19:26:18
【问题描述】:

我有一个如下所示的表格:

 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

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

【问题讨论】:

  • "嵌套表的第三行" .你有一个问题,因为嵌套表没有按特定顺序存储(就像常规表一样)。所以“第三行”可以是任何元素,不一定是您插入的第三项。例如,如果您将 `insert into my_table values (200, SUBACCOUNT_NT(2000, NULL, 999));` 999 可能会或可能不会随着时间的推移成为第三行。只有 VARRAY 有可靠的排序

标签: sql oracle select oracle11g nested-table


【解决方案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 为空的行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2021-10-27
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2012-09-02
    • 2012-08-29
    相关资源
    最近更新 更多