2008-11-25 20 views
8

Al ejecutar el siguiente (completa) consulta SQL en Microsoft SQL Server 2000:nombre de la columna ambiguo de error

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 

Me da 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?

+0

Puede deshacerse de cada detalle en su consulta. –

+0

Además, parece que ha creado una "tabla de búsqueda True One", un error de diseño de modelado de datos tan común que tiene su propio nombre. Aunque podría estar equivocado, el patrón se ve ¡Oh! tan familiar. Google ese término. –

Respuesta

24

Debido ARTIFACTTYPE puede hacer referencia a A.ARTIFACTTYPE o B.ARTIFACTTYPE y el servidor tiene que saber cuál de ellos desea, simplemente cambiarlo a A.ARTIFACTTYPE y usted debe 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 entre cuál de las dos columnas desea 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).

+0

¿Cuál es el voto negativo? –

+0

Porque, según mi propia respuesta a continuación, no veo por qué algo en esta consulta es ambiguo. En particular, no veo ningún ARTIFACTTYPE no calificado en el que tenga sentido agregar A o B. Tu explicación de lo que significa la ambigüedad está bien, pero sospecho que el OP entiende todo eso. –

+1

Gracias Dave, después de mirar la consulta con más cuidado, no parece que haya ambigüedad, aunque he usado bases de datos que son muy exigentes con la imposición de alias, SQL Server podría ser una de ellas. En cualquier caso, independientemente de la consulta publicada, mi respuesta aborda claramente el error informado. –

0

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

+0

¿Por qué? ¿Por qué esas líneas serían ambiguas pero las líneas 5, 6 y 7 no lo serían? –

+0

Pensé lo mismo al principio, pero después de mirar más de cerca el código, admitiría a Dave en ese – kristof

+0

No estoy seguro de por qué esas líneas son ambiguas. Solo te digo lo que está diciendo mgmt studio. El servidor db de 8 años podría tener algo que ver con eso. Supongo que ustedes lo han intentado en el servidor sql 2000 como el cartel original especificado. Gracias por los votos bajos sin siquiera intentarlo en sql 2000. – Logicalmind

2

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 ningún problema.

EDIT Añadiendo la salida exacta 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 completada. NINGUN OTRO CAMBIO. 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 moverse por el error es dar a la mesa en cada cláusula select un alias exclusivo y calificar todas las referencias de columna. De esta manera:

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 
+0

Usó nombres de alias donde el OP no lo hizo, es por eso que es correcto en su versión, realmente solucionó el problema. –

+0

Sean: La consulta que escribí arriba es mi sugerencia al OP sobre cómo solucionar su problema. No es lo que ejecuté en mi base de datos. Dos pensamientos separados. –

+0

Agregué un ejemplo concreto que muestra que puedo ejecutar la consulta EXACTA del OP en Oracle sin obtener un error de ambigüedad. –

1

¿Estás haciendo la consulta completa? Tal vez usted tiene también la cláusula ORDER BY - que podrían provocar que ese problema

Yo apoyaría Dave on that that no debería haber ningún problema con la consulta publicado

0

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

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