Использовать результаты SELECT в качестве имени столбца для родительского SELECT - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть таблица TMP_FOO, в которой есть те же столбцы, что и в FOO, и еще немного. Мне нужно вставить все строки из TMP_FOO в FOO. Я мог бы написать следующее:

INSERT INTO FOO (SELECT bar, baz FROM TMP_FOO);

Но мне нужно, чтобы оно было обобщенным c, чтобы я мог только изменять имя таблиц. Моя лучшая попытка:

INSERT INTO FOO
(SELECT 
  (SELECT column_name
  FROM USER_TAB_COLUMNS
  WHERE table_name = 'FOO')
FROM
 f2020.TMP_FOO)

Что не работает, потому что

SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'FOO'

возвращает несколько строк. Могу ли я архивировать то, что я хочу, простым SQL (без необходимости динамического построения строки запроса)?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Можно ли архивировать то, что я хочу, простым SQL (без необходимости динамического построения строки запроса)?

Нет.

В простом SQL невозможно создать список выходных столбцов из другого запроса. База данных должна знать, какие столбцы запрос будет возвращать в то время, когда он анализирует запрос (ie до запроса фактически выполняется).

0 голосов
/ 06 апреля 2020

Вы не используете столбцы names из результата, INSERT INTO таблица SELECT должна сохранять то же количество столбцов с таблицей назначения. Я думаю, что это невозможно создать список времени выполнения колонки. Вы должны ввести все столбцы FOO - в качестве первого примера:

INSERT INTO FOO (SELECT FOO_colname_1, FOO_colname_2, FOO_colname_3 FROM TMP_FOO);

и наоборот, если FOO_TEMP имеет больше столбцов, необходимо добавить значения NULL или значения по умолчанию:

INSERT INTO TMP_FOO (SELECT TMP_FOO_colname_1, TMP_FOO_colname_2, TMP_FOO_colname_3, NULL, NULL FROM FOO);
...