2010-11-24 7 views
16

Acabo de encontrar un comportamiento extraño en Oracle donde espero que ORA-00918 se eleve, pero no es así. Tome esta consulta, por ejemplo.¿Por qué Oracle no plantea "ORA-00918: columna ambiguamente definida" para esta consulta?

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

Esta consulta está teóricamente en busca de los detalles de las tablas con los disparadores con discapacidad, 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 yo sé, se aplica a cualquier conjunto de tablas o vistas (de las dos o tres que he probado).

De todos modos, intenta ejecutar esta consulta y se obtiene ORA-00918 porque ambos USER_TABLES y USER_TRIGGERS tienen una columna llamada STATUS así que para obtener la consulta para ejecutar la cláusula de WHERE necesita ser cambiado a TRG.STATUS. Ok, genial, pero intenta 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 quiere decir, funciona mágicamente! No importa la semántica o lo que devuelve la consulta, no hay ningún error. USER_CONSTRAINTS incluso tiene una columna llamada STATUS también, entonces ¿cómo es que no sabe qué hacer cuando hay dos columnas para elegir pero está bien con aún más ambigüedad?

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

actualización

Gracias a BQ para demostrar el error se corrige en 11.2.0.1.0. ¡Bounty para cualquiera que pueda mostrarlo corregido en una versión anterior!

+1

muy buena pregunta de hecho, puede 'seleccionar distinto estado' en la segunda consulta, y' seleccionar distinto tab.status' y obtendrá resultados diferentes. – Benoit

+0

Veo el mismo comportamiento 9.2.0.8.0 y 10.2.0.4.0 –

+0

Me he sentido molesto por este problema anteriormente. No se pudo explicar por qué una columna de clave ahora tenía nulos después de la unión externa a otra tabla. Es bueno ver que no soy el único! Y me alegra ver que está arreglado en 11g. –

Respuesta

8

No se puede decir cuando se fijó, 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 
+0

@BQ Creo que es posible que haya leído mal la pregunta. Ese levanta el error, pero cuando agregas USER_CONSTRAINTS no –

+0

@Conrad, lo eché de menos, pero he editado mi respuesta para mostrar que estoy obteniendo el ORA-00918 para ambas consultas. –

+0

@BQ +1 Bueno, es bueno saber que se corrigió –

2

Está utilizando ANSI SQL. Supongo que asocia el ESTADO en la cláusula where con la mesa de conducción.

Cuando usa la sintaxis "oracle" verá 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' 
+3

En lugar de las sintaxis ANSI y Oracle, es posible que desee referirse a ellas como ANSI 89 y ANSI 92, ya que ambas son ANSI. –

+0

@Conrad - yup. Estás en lo correcto. – erbsock

13

Buscado soporte de Oracle y encontré esto:

Bug 5368296 - ANSI SQL de la combinación no puede informar ORA 918 para la columna ambigua [ID 5368296.8]

Versiones confirmados como afectados:

  • 10.2.0.3
  • 10.2.0.4

Este problema se corrigió en

  • 10.2.0.4 Patch 2 en plataformas Windows
  • 10.2.0.5 (Patch conjunto de servidores)
  • 11.1.0.6 (Versión base)

No publicando más ya que necesita una cuenta de Oracle Support para ver los detalles, pero pensó que el número/versiones de Oracle Bug afectadas estaría bien para compartirlo para orientarlo en la dirección correcta Soporte de Oracle

+0

Bueno, un BQ, eso es justo lo que buscaba. ¡Muchas gracias! – batwad

0

Bueno, si intento esto en 11.2.0.2.0, me sale el mismo problema. Independientemente de la funcionalidad, si agrega algunas combinaciones izquierda y derecha, ¡este error no parece corregido 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' 
Cuestiones relacionadas