Я только что столкнулся со странным поведением в Oracle, где я ожидал, что ORA-00918 будет повышен, но это не так.Возьмем, к примеру, этот запрос.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Этот запрос специально ищет детали таблиц с отключенными триггерами, но учтите, что это не та проблема, которую я пытаюсь решить.Проблема не уникальна для этого запроса, словаря данных, представлений или таблиц;насколько я могу судить, это применимо к любому набору таблиц или представлений (из двух или трех, которые я пробовал).
В любом случае, попробуйте выполнить этот запрос, и вы получите ORA-00918, потому что оба USER_TABLES
и USER_TRIGGERS
имеют столбец с именем STATUS
, поэтому для получения запроса на выполнение предложения WHERE
необходимо изменить на TRG.STATUS
.Хорошо, круто, но попробуйте вместо этого присоединиться к другой таблице.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Этот запрос, без уточнения, какой столбец STATUS вы имеете в виду, волшебным образом работает!Не берите в голову семантику или то, что возвращает запрос, ошибки нет.USER_CONSTRAINTS
даже имеет столбец с именем STATUS
, так почему же он не знает, что делать, когда есть два столбца на выбор, но это нормально с еще большей неопределенностью?
Это все включено10.2.0.3.0, кстати, и, по сути, ORA-00918 перестает вызываться, если в вашем запросе более двух таблиц.Если это ошибка Oracle, кто-нибудь знает, когда она была исправлена и какая версия Oracle может привести к сбою ковбойских запросов при обновлении нашей базы данных?
Обновление
Спасибо BQ за демонстрацию, ошибка исправлена в 11.2.0.1.0.Баунти для всех, кто может показать ее исправленной в более ранней версии!