ORA-00918: столбец неоднозначно определен: как найти столбец
Я получаю классическую ошибку "ORA-00918: столбец неоднозначно определен", обычно я знаю, как ее решить, но сейчас моя проблема в том, что я работаю с запросом в 700 строк. Есть ли способ идентифицировать колонку?
Спасибо Даниэле
5 ответов
Вы пытались сделать бинарный поиск?
например
Если ваш оригинальный запрос выглядит Select col1
,col2
,col3
,col4
from MyTable
Вы можете начать с комментирования второй половины
Select col1 ,col2 /*,col3 ,col4 */ from MyTable
Если вы по-прежнему получаете сообщение об ошибке, запустите запрос еще раз, комментируя некоторые столбцы из другой половины:
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 ...
исправил проблему.