Мне нужно добавить виртуальный столбец в результат подзапроса динамическим способом. Мне нужно добавить n виртуальный столбец как n значение внутри вложенной таблицы nt для каждого результата подзапроса. Я имею в виду, например, у меня есть вложенная таблица nt из 7 результатов, т. nt = {'one','two','three','four','five','six','seven'}
и подзапрос (SELECT), который возвращает 30 результатов, то есть:
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 ответа
Перекрестно присоедините два выхода:
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
во вложенной таблице.
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()