ora forma definida columna ambiguously ambigua sql oracle oracle10g oracle11g ora-00918

sql - ambiguously - ¿Por qué Oracle no genera "ORA-00918: columna definida de forma ambigua" para esta consulta?



ambiguously defined (5)

Bueno, si intento esto el 11.2.0.2.0, me sale el mismo problema. Independientemente de la funcionalidad, si agrega algunas combinaciones a la izquierda y a la derecha, ¡este error no parece corregirse en absoluto!

SELECT * FROM USER_TABLES TAB LEFT JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME RIGHT JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME WHERE STATUS = ''DISABLED''

Acabo de encontrar un extraño comportamiento en Oracle en el que esperaría que se generara ORA-00918, pero no lo es. Tomemos esta consulta, por ejemplo.

SELECT * FROM USER_TABLES TAB JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME WHERE STATUS = ''DISABLED''

Esta consulta busca teóricamente los detalles de las tablas con desencadenadores deshabilitados, pero tenga en cuenta que este no es el problema que estoy tratando de resolver. El problema no es exclusivo de esta consulta, el diccionario de datos, las vistas o las tablas; Hasta donde puedo decir, se aplica a cualquier conjunto de tablas o vistas (de las dos o tres que he probado).

De todos modos, intente ejecutar esta consulta y obtendrá ORA-00918 porque tanto USER_TABLES como USER_TRIGGERS tienen una columna llamada STATUS modo que para que la consulta ejecute la cláusula WHERE debe cambiarse a TRG.STATUS . Ok, genial, pero trata de unirte a otra mesa.

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''

Esta consulta, sin calificar a qué columna de ESTADO te refieres, ¡funciona mágicamente! No importa la semántica o lo que devuelve la consulta, no hay ningún error. USER_CONSTRAINTS también tiene una columna llamada STATUS , así que, ¿por qué no sabe qué hacer cuando hay dos columnas para elegir pero está bien con más ambigüedad?

Por cierto, todo esto está en 10.2.0.3.0, y en esencia ORA-00918 deja de plantearse si tiene más de dos tablas en su consulta. Si se trata de un error de Oracle, ¿alguien sabe cuándo se solucionó y, por lo tanto, qué versión de Oracle puede hacer que las consultas de vaqueros estallen si nuestra base de datos se actualiza?

Actualizar

Gracias a BQ por demostrar que el error se ha corregido en 11.2.0.1.0. ¡Una recompensa para cualquiera que pueda mostrarlo en una versión anterior!


Busqué en Oracle Support y encontré esto:

Error 5368296 - ANSI join SQL puede no informar ORA-918 para columna ambigua [ID 5368296.8]

Versiones confirmadas como afectadas:

  • 10.2.0.3
  • 10.2.0.4

Este problema se soluciona en

  • 10.2.0.4 Patch 2 en plataformas Windows
  • 10.2.0.5 (conjunto de parches de servidor)
  • 11.1.0.6 (Lanzamiento base)

No publique más que eso ya que necesita una cuenta de soporte de Oracle para ver los detalles, pero pensó que el número de error de Oracle / las versiones afectadas podrían compartirse para señalarle la dirección correcta en el soporte de Oracle.


Está utilizando ANSI SQL. Supongo que asocia el ESTADO en la cláusula where con la tabla de manejo.

Cuando uses la sintaxis de "oracle" verás el comportamiento esperado.

SELECT * FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON WHERE TRG.TABLE_NAME = TAB.TABLE_NAME AND CON.TABLE_NAME = TAB.TABLE_NAME AND STATUS = ''DISABLED''



No puedo decir cuándo se solucionó, pero aquí están mis resultados:

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SQL> SELECT * 2 FROM USER_TABLES TAB 3 JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 4 WHERE STATUS = ''DISABLED''; WHERE STATUS = ''DISABLED'' * ERROR at line 4: ORA-00918: column ambiguously defined SQL> ed Wrote file afiedt.buf 1 SELECT * 2 FROM USER_TABLES TAB 3 JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 4 JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME 5* WHERE STATUS = ''DISABLED'' SQL> / WHERE STATUS = ''DISABLED'' * ERROR at line 5: ORA-00918: column ambiguously defined