Добавление виртуального столбца в инструкции SELECT из списка значений подзапроса в Oracle динамически

Мне нужно добавить виртуальный столбец в результат подзапроса динамическим способом. Мне нужно добавить 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()

демонстрация


Есть идеи?

10000