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

Adding a virtual column in SELECT statement from a list of value of a subquery in Oracle dynamically

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

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

子查询结果:

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

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

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

中的索引迭代进行的总查询

交叉连接两个输出:

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

您可以在嵌套的 table.

上将 table/query 结果与 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