ORA-00918: столбец неоднозначно определен: как найти столбец

Я получаю классическую ошибку "ORA-00918: столбец неоднозначно определен", обычно я знаю, как ее решить, но сейчас моя проблема в том, что я работаю с запросом в 700 строк. Есть ли способ идентифицировать колонку?

Спасибо Даниэле

5 ответов

Вы пытались сделать бинарный поиск?

например

Если ваш оригинальный запрос выглядит Select col1 ,col2 ,col3 ,col4 from MyTable

  1. Вы можете начать с комментирования второй половиныSelect col1 ,col2 /*,col3 ,col4 */ from MyTable

  2. Если вы по-прежнему получаете сообщение об ошибке, запустите запрос еще раз, комментируя некоторые столбцы из другой половины:

Select col1 /*col2 */ col3 col4 from MyTable

Если вы все еще получаете ошибку, то ваша проблема с col1, в противном случае вам нужно изменить col2

Неоднозначное сообщение об ошибке в столбце указывает на то, что вы объединили в своем запросе два (или более) столбца с одинаковым именем столбца.

Правильный способ решить эту проблему - дать каждой таблице в запросе псевдоним, а затем префикс всех ссылок на столбцы с соответствующим псевдонимом. Я согласен, что такой большой запрос не доставит удовольствия, но я боюсь, что вам придется заплатить цену за слабость вашего предшественника.

В Oracle вы можете использовать all_tab_cols для запроса имен столбцов ваших таблиц. Следующий запрос вернет общие имена столбцов между TABLE1 и TABLE2. Тогда вам просто нужно добавить префикс этих общих столбцов вместо всех 100 ссылок на столбцы.

select column_name from all_tab_cols
where table_name='TABLE1' and owner ='OWNER1' 
and column_name in (
select column_name from all_tab_cols
where table_name='TABLE2' and owner ='OWNER2')  

Вы можете проверить общие столбцы с помощью:

 select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamefirst'
intersect
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamesecond';

Ради потомков: у меня была эта проблема, когда я выбирал столбцы TABLE1.DES и TABLE2.DES в запросе без наложения результата. Когда я запустил его один, мой редактор SQL превратил их в DES и DES_1, никаких претензий.

Однако, когда я превратил тот же запрос в подзапрос

SELECT a.col1, a.col2, a.col3, b.*
from TABLE3 a
INNER JOIN (
--that query as a subquery
) b
on a.PK=b.FK`

он выдал то же сообщение об ошибке ORA-00918, которое вы описали. Изменение SELECT в моем подзапросе на

SELECT TABLE1.DES AS T1_DES, TABLE2.DES AS T2_DES ...

исправил проблему.

Другие вопросы по тегам