multiple - top distinct sql
Mezclando "USING" y "ON" en Oracle ANSI join (3)
Escribí una expresión Oracle SQL como esta:
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 trato de ejecutarlo, Oracle arroja un error en la línea con la autocomunicación "ON" 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?
Mi preferencia es nunca usar USING ; siempre use ON . 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 se produce porque tiene account_no
en mc_current_view
, account_master
y ml_client_account
por lo que no se puede resolver la unión real. Espero que esto ayude.
El mensaje de error es en realidad (¡sorpresa!) Diciéndole 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 forma de resolver esto es no utilizar la cláusula USING en ninguna parte de su consulta, ya que debe tener el calificador en la segunda condición de unión:
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);
El uso es más limpio (imo), pero aún así es deseable hacer una referencia externa de los campos de unión como en el ejemplo org o en 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);
Da la respuesta incorrecta porque join_id dentro de la subconsulta implica C.join_id (que coincide con todos los registros) en lugar de A o B. Quizás 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.