【问题标题】:Adding a virtual column in SELECT statement from a list of value of a subquery in Oracle dynamically从 Oracle 中子查询的值列表中动态添加 SELECT 语句中的虚拟列
【发布时间】:2018-11-21 13:32:18
【问题描述】:

我需要以动态方式在子查询的结果上添加一个虚拟列。我需要在嵌套表 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| 

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

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 循环,因为主查询太大并且有几个子查询,因此我不想为一个由 a 进行的总查询的每个结果创建一个 UNION nt内索引的迭代

【问题讨论】:

  • 请不要在其他 RDBMS 上添加垃圾邮件标签。

标签: sql oracle plsql subquery nested-table


【解决方案1】:

您可以将您的表/查询结果与嵌套表上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

【讨论】:

  • 此解决方案不起作用,因为我需要嵌套表给出的列的名称。我的意思是,如何在嵌套表的列上添加别名?
  • @Alfonso:我不确定你在问什么。这回答了您提供的详细信息的原始问题。如果您还有其他问题,请询问另一个问题,充分展示您实际尝试做的事情。
【解决方案2】:

交叉连接两个输出:

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 (...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2017-09-26
    • 2013-09-17
    • 2015-12-19
    • 1970-01-01
    • 2023-02-25
    • 2011-06-18
    相关资源
    最近更新 更多