2009-01-19 18 views
8

me escribió una expresión SQL de Oracle como esto:Mezcla "Uso" y "ON" en Oracle combinación ANSI

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am USING (account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca USING (account_no) 

Cuando intento ejecutarlo, Oracle lanza un error en la línea con "ON" auto -unirse diciendo: "ORA-25154: la parte de la columna de la cláusula USING no puede tener calificador".

Si omito el calificador "am", dice: "ORA-00918: columna ambiguamente definida".

¿Cuál es la mejor manera de resolver esto?

Respuesta

13

El mensaje de error es en realidad (¡sorpresa!) Indicándote exactamente cuál es el problema. Una vez que utiliza la cláusula USING para una columna en particular, no puede usar un alias de calificador/tabla de columna para ese nombre de columna en cualquier otra parte de su consulta. La única manera de resolver esto es no utilizar la cláusula USING en cualquier lugar de la consulta, ya que tiene que tener el calificador en la segunda condición de unirse a:

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am ON (a.account_no = am.account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca ON (a.account_no = mca.account_no); 
+1

Puede hacer una referencia para esto: "Una vez que usa la cláusula USING para una columna en particular, no puede usar un calificador de columna/alias de tabla para ese nombre de columna en cualquier otra parte de su consulta." Parece una restricción estúpida e invalida la existencia exclusiva de USING. – TWiStErRob

+0

Ha pasado tanto tiempo que no tengo la referencia a mano. Sin embargo, si lo intentas, verás que es verdadero (al menos en 10g). IMO, la cláusula USING es perfectamente inútil. – DCookie

8

Mi preferencia nunca es usar UTILIZANDO; siempre use EN. Me gusta que mi SQL sea muy explícito y la cláusula USING se siente un paso más en mi opinión.

En este caso, el error viene alrededor porque usted tiene account_no en mc_current_view, account_master y ml_client_account por lo que el real se unen no puede ser resuelto. Espero que esto ayude.

0

la utiliza está limpio (OMI), pero todavía es deseable a refererence externamente los campos unirse como en el ejemplo org o un ejemplo como este:

select A.field, 
     B.field, 
     (select count(C.number) 
      from tableC C 
     where C.join_id = join_id -- wrong answer w/o prefix, exception with. 
     ) avg_number 
    from tableA A 
    join tableB B using (join_id); 

Se da la respuesta equivocada porque el join_id dentro de la subconsulta implica C.join_id (ajustando todos los registros) en lugar de a o B. Tal vez la mejor manera de resolverlo sea simplemente permitir referencias explícitas con el uso, teniendo lo mejor de ambos mundos. Parece que hay una necesidad debido a casos como estos.

Cuestiones relacionadas