代码之家  ›  专栏  ›  技术社区  ›  Giacomo Brunetta

在Oracle的子查询值列表中动态添加select语句中的虚拟列

  •  1
  • Giacomo Brunetta  · 技术社区  · 6 年前

    我需要以动态方式在子查询的结果上添加虚拟列。我需要在嵌套表NT中为子查询的每个结果添加N个虚拟列作为N值。我的意思是,例如,我有一个包含7个结果的嵌套表NT,即 nt = {'one','two','three','four','five','six','seven'} 以及返回30个结果的子查询(select),即:

    FROM{
    ----- SUBQUERY WITH 30 RESULTS ------
    }
    

    子查询结果:

    ID|NAME|SURNAME|
    1|JACK|BROWN| 
    2|BRAD|PITT| 
    3|ROBBIE|WILLIAMS| 
    . 
    . 
    . 
    30|JOHNNY|DEPP| 
    

    我想为子查询结果的每个元素添加一列,即嵌套表值的列。我的意思是,最后我想要一个子查询结果行*嵌套表值=30*7=210行,以动态方式获得,因为嵌套表可以升级。最后我想得到这样的东西:

    ID|NAME|SURNAME|nt_value
    1|JACK|BROWN|one 
    1|JACK|BROWN|two 
    1|JACK|BROWN|three 
    . 
    . 
    . 
    1|JACK|BROWN|seven 
    2|BRAD|PITT|one 
    2|BRAD|PITT|two 
    . 
    . 
    . 
    2|BRAD|PITT|seven
    . 
    . 
    . 
    30|JOHNNY|DEPP|one 
    . 
    . 
    . 
    30|JOHNNY|DEPP|seven 
    
    (Main query) 
    
    FROM { SELECT id, name, surname, [nt] AS nt_value FROM artist} 
    (query main continue)
    

    我不想插入PLSQL FOR...LOOP 循环,因为主查询太大并且有几个子查询,所以我不想 UNION 通过在NT中迭代索引得到的总查询的每个结果

    2 回复  |  直到 6 年前
        1
  •  1
  •   Caius Jard    6 年前

    交叉连接两个输出:

    SELECT * FROM
    (/*put query that returns 30 rows here*/) q30
    CROSS JOIN
    (/*query that returns 10 rows here*/) q7
    

    用途:

    SELECT * FROM
    /* other tables or subqueries here */
    WHATEVER JOIN
    (
      SELECT * FROM
      (/*put query that returns 30 rows here*/) q30
      CROSS JOIN
      (/*query that returns 10 rows here*/) q7
    ) q210
    ON (...)
    
        2
  •  3
  •   Kaushik Nayak    6 年前

    您可以将表/查询结果与 TABLE 嵌套表上的函数。

    CREATE OR REPLACE TYPE tab_nested_type AS TABLE OF VARCHAR2(10); 
    /
    
    
    SELECT t.*,
           st.column_value AS nt_value
    FROM t                             --or your subquery
    CROSS JOIN                         
         TABLE ( tab_nested_type('one','two','three','four','five','six','seven') ) st
    ORDER BY id;
    

    如果您使用的是Oracle 12.2或更高版本,则甚至不需要指定 TABLE()

    Demo