Oracle: столбец определен неоднозначно - PullRequest
4 голосов
/ 31 августа 2011

Я знаю, что таких вопросов много, но мой вопрос не в том, как избавиться от этой ошибки, а в том, как это работало ранее в 9-й версии Oracle.

У меня есть старые источники, написанные на Ruby и Oracle DB, которые недавно были обновлены до версии = 11.

Я не могу редактировать данные в БД Oracle, только читать. скажем, есть две таблицы: таблица A (id, имя, тип, клиент) и таблица B (id, a_id, тип, персона)

так. в исходном коде есть запрос:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

так что в Oracle 9 это работало отлично, но теперь у меня появляется ошибка «неопределенно определен столбец».

Я бы хотел знать:

where type = 'A'

совпадает с

where a.type = 'A' AND b.type = 'A'

или

where a.type = 'A' OR b.type = 'A'

Ответы [ 4 ]

5 голосов
/ 31 августа 2011

Я думаю, что это было ошибкой при объединении в стиле ANSI.Используйте DBMS_XPLAN, чтобы найти, какая таблица была отфильтрована в старой базе данных.

Или, что еще лучше, определите из бизнес-логики, что они должны запрашивать.

5 голосов
/ 31 августа 2011

Нет, и это проблема: это может означать

where a.type = 'A'

или может означать

where b.type = 'A'

с потенциально различными результатами;следовательно, ошибка говорит о том, что она определена неоднозначно.

2 голосов
/ 31 августа 2011

Я думаю, вам следует протестировать в Oracle 9 (где вы говорите, что он работает) и сравнить вывод неоднозначного запроса:

--- Base
select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

с обоими не двусмысленными:

--- QueryA
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

и

--- QueryB
select a.id,b.id from a join b on a.id = b.a_id where b.type = 'A'

Примерно так будет:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'
MINUS
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

(короче):

(Base)
MINUS
(QueryA)

, а затем:

(QueryA)
MINUS
(Base)

Если оба вышеуказанных запроса MINUS возвращают 0 строк, то запрос BASE интерпретируется как QueryA.

Проверьте аналогично и сравните Base с QueryB.


Другая вероятная причина этой ошибки заключается в том, что во время (или примерно с тем же периодом) миграции столбец type был добавлен во 2-й таблице. У вас есть старые версии определений таблиц базы данных, чтобы это проверить?

1 голос
/ 01 сентября 2011

Все - имейте в виду, что в движке оптимизации для 11g произошли серьезные изменения. Если вы установите уровень оптимизатора запросов на 10.2.x для своего экземпляра 11g, держу пари, что запрос снова заработает.

Это значит, что вы должны предоставить псевдоним для него, чтобы он не был двусмысленным для сервера баз данных или администратора баз данных, идущих за вами. :)

...