Динамическое добавление виртуального столбца в операторе SELECT из списка значений подзапроса в Oracle - PullRequest
0 голосов
/ 21 ноября 2018

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

и я хочу добавить столбец для каждого элемента результата подзапроса, столбец значений вложенной таблицы.Я имею в виду, наконец, я хочу, чтобы строки результатов подзапроса * значения вложенной таблицы = 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 ]

0 голосов
/ 21 ноября 2018

Вы можете перекрестно объединить результаты таблицы / запроса с выводом функции 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()

Демо

0 голосов
/ 21 ноября 2018

Перекрестное соединение двух выходов:

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