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