В этом случае вам не нужен подзапрос - как показало @Littlefoot. Но если вы сделали это в более сложном сценарии, вы можете избежать ошибки, создав псевдонимы выражений столбцов в подзапросе:
INSERT INTO sample (
HOST,
TOTAL_PING,
TOTAL_UNAVAILABLE_PING
)
SELECT * FROM (
SELECT 'FR3158-73-1' as host,
82 as total_ping,
82 as total_unavailable_ping
FROM DUAL
UNION ALL
SELECT 'FR3158-76-2',
80,
10
FROM DUAL
)
/
2 rows inserted.
Проблема заключается в том, что подзапрос сам по себе получает псевдонимы столбцов. , полученное из значений в первой ветви запроса:
SELECT 'FR3158-73-1',
82,
82
FROM DUAL
UNION ALL
SELECT 'FR3158-76-2',
80,
10
FROM DUAL
'FR3158-73- 82 82
----------- ---------- ----------
FR3158-73-1 82 82
FR3158-76-2 80 10
Второй и третий столбцы называются "82"
, что является неоднозначностью, на которую жалуется ORA-00918, с внешней стороны select
. Если вы добавляете псевдонимы, которые исчезают:
SELECT 'FR3158-73-1' as host,
82 as total_ping,
82 as total_unavailable_ping
FROM DUAL
UNION ALL
SELECT 'FR3158-76-2',
80,
10
FROM DUAL
HOST TOTAL_PING TOTAL_UNAVAILABLE_PING
----------- ---------- ----------------------
FR3158-73-1 82 82
FR3158-76-2 80 10
, чтобы внешний запрос больше не путался. Обратите внимание, что вам нужны только псевдонимы в первой ветви объединения (обычно , в любом случае ) - их не повреждает во всех ветвях, они просто игнорируются, но это немного экономит набрав, если вы создаете это вручную. Фактические псевдонимы также не имеют значения в этом случае, они просто должны быть уникальными; в частности, они не должны совпадать со столбцами, в которые вы вставляете, - но если они это сделают, вам будет проще следить за ними.
Если вы сделаете это так, как @Littlefoot показал, что у вас нет промежуточного результата установите select
, чтобы производные имена не нужно было оценивать (если можно сказать, что они вообще существуют), поэтому двусмысленность не видна - она чисто позиционная.