promocionado objeto dato columna campos ambiguos ambiguo ambiguedad ambigua sql sqlexception

sql - objeto - en where clause es ambigua



Error de nombre de columna ambiguo (5)

Al ejecutar la siguiente consulta SQL (completa) en Microsoft SQL Server 2000:

SELECT B.ARTIFACTTNS, B.ARTIFACTNAME, B.ARTIFACTTYPE, B.INITIALBYTES, B.TIMESTAMP1, B.FILENAME, B.BACKINGCLASS, B.CHARENCODING, B.APPNAME, B.COMPONENTTNS, B.COMPONENTNAME, B.SCAMODULENAME, B.SCACOMPONENTNAME FROM (SELECT DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME FROM (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME FROM CUSTPROPERTIES WHERE PNAME = ''AcmeSystemName'' AND PVALUE = ''MyRuleGroup'' UNION SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME FROM CUSTPROPERTIES WHERE PNAME = ''AcmeSystemDisplayName'' AND PVALUE = ''MyRuleGroup'') A, (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME FROM CUSTPROPERTIES WHERE PNAME = ''AcmeSystemTargetNameSpace'' AND PVALUE = ''http://MyModule'') B WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME) A, BYTESTORE B WHERE (A.ARTIFACTTYPE = ''BRG'') AND A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME ORDER BY ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME

Obtengo la siguiente excepción:

java.sql.SQLException: [Acme][SQLServer JDBC Driver][SQLServer] Ambiguous column name ''ARTIFACTTYPE''.

¿Qué estoy haciendo mal aquí y cómo puedo corregirlo?


Debido a que ARTIFACTTYPE puede referirse a A.ARTIFACTTYPE o B.ARTIFACTTYPE y el servidor necesita saber cuál quiere, simplemente cámbielo a A.ARTIFACTTYPE y usted debería estar bien en este caso.

Para aclarar, debe especificar el prefijo de alias cada vez que el nombre de la columna sea ambiguo. No es una mala práctica usar siempre prefijos de alias, ya que deja en claro qué columnas provienen de qué tablas cuando lee la consulta, y elimina problemas como este.

Uno podría preguntarse por qué necesita distinguir cuál de las dos columnas quiere cuando ambas se refieren a la misma columna en la misma tabla. La respuesta es que cuando se une a una tabla, los valores de A.column y B.column pueden ser diferentes dependiendo de los criterios de unión (como puede ser el caso con una combinación externa donde los valores en una de las columnas pueden ser nulo).


Para ser claros, son las líneas 13, 14 y 15 las que tienen las columnas ambiguas.


Si esa es la consulta exacta que está ejecutando, no tengo idea de por qué encontraría algo ambiguo.

Escribí lo que creo que es una consulta equivalente y la ejecuté en mi base de datos (Oracle) sin problemas.

EDITAR Agregar el resultado exacto de un nuevo experimento en Oracle. La consulta ejecutada en este experimento es la consulta exacta dada por el OP, con el nombre de la tabla completa. NO HAY OTROS CAMBIOS . No hay nada ambiguo en esta consulta. Entonces, o bien esa no es la consulta exacta que se está ejecutando, o SQL Server tiene un error de analizador.

SQL> create table props (pname varchar2(100), 2 pvalue varchar2(100), 3 artifacttype number, 4 artifacttns number, 5 artifactname number); Table created. SQL> SELECT 2 DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 3 FROM 4 (SELECT DISTINCT 5 ARTIFACTTYPE, 6 ARTIFACTTNS, 7 ARTIFACTNAME 8 FROM props 9 WHERE PNAME = ''AcmeSystemName'' 10 AND PVALUE = ''MyRuleGroup'' 11 UNION 12 SELECT DISTINCT 13 ARTIFACTTYPE, 14 ARTIFACTTNS, 15 ARTIFACTNAME 16 FROM props 17 WHERE PNAME = ''AcmeSystemDisplayName'' 18 AND PVALUE = ''MyRuleGroup'') A, 19 (SELECT DISTINCT 20 ARTIFACTTYPE, 21 ARTIFACTTNS, 22 ARTIFACTNAME 23 FROM props 24 WHERE PNAME = ''AcmeSystemTargetNameSpace'' 25 AND PVALUE = ''http://mymodule'') B 26 WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE 27 AND A.ARTIFACTTNS = B.ARTIFACTTNS 28 AND A.ARTIFACTNAME = B.ARTIFACTNAME 29 / no rows selected

Fin Editar

Mi sugerencia para evitar el error es dar a la tabla en cada cláusula de selección un alias único y calificar todas las referencias de columna. Me gusta esto:

SELECT DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME FROM (SELECT DISTINCT P1.ARTIFACTTYPE, P1.ARTIFACTTNS, P1.ARTIFACTNAME FROM {PROPERTIES_TABLE_NAME} P1 WHERE PNAME = ''AcmeSystemName'' AND PVALUE = ''MyRuleGroup'' UNION SELECT DISTINCT P2.ARTIFACTTYPE, P2.ARTIFACTTNS, P2.ARTIFACTNAME FROM {PROPERTIES_TABLE_NAME} P2 WHERE PNAME = ''AcmeSystemDisplayName'' AND PVALUE = ''MyRuleGroup'') A, (SELECT DISTINCT P3.ARTIFACTTYPE, P3.ARTIFACTTNS, P3.ARTIFACTNAME FROM {PROPERTIES_TABLE_NAME} P3 WHERE PNAME = ''AcmeSystemTargetNameSpace'' AND PVALUE = ''http://mymodule'') B WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME


Debe especificar las tablas en la cláusula ORDER BY , así:

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME


¿Estás haciendo una lista de la consulta completa? Quizás también tenga la cláusula ORDER BY, eso podría causar ese problema

Apoyaría a Dave en que no debería haber ningún problema con la consulta publicada