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