Saltar al contenido

ORA-01799: una columna no se puede unir externamente a una subconsulta

Después de investigar con especialistas en este tema, programadores de diversas áreas y maestros hemos dado con la respuesta al dilema y la dejamos plasmada en este post.

Solución:

puede reescribir eso presionando la subconsulta para que no esté unida externamente:

select Count(C.setid)
  from mycustomer C
       left outer join (select *
                          from mycustoption co
                         where co.effdt <= (select Max(COI.effdt)
                                              from mycustoption COI
                                             where COI.setid = co.setid
                                               and COI.cust_id = co.cust_id
                                               and COI.effdt <= sysdate)) co
                    on ( C.setid = CO.setid
                         and C.cust_id = CO.cust_id ) 

Bueno, aparentemente Oracle no admite el uso de una subconsulta dentro de la condición de combinación para una combinación externa. Así que necesitas deshacerte de la subconsulta.

La pregunta es, ¿por qué está ahí? Tiene "<=" condiciones en dos lugares, por lo que el predicado esencialmente dice "todos los registros cuya fecha de vigencia no sea posterior a la última fecha de vigencia que no sea posterior a ahora". Si eso es lo que realmente desea, puede simplificarlo a "todos los registros cuya fecha de vigencia no sea posterior a la actual", es decir:

ON 
    (C.SETID = CO.SETID 
        AND C.CUST_ID = CO.CUST_ID 
        AND CO.effdt <= SYSDATE    
)

Voila, sin subconsulta.

Pero, ¿es eso realmente lo que quiere, o quiso decir que primero "<=" sea solo "=", es decir, encontrar el registro con la fecha de vigencia más reciente antes de ahora? Si eso es lo que realmente quieres, será más complejo reescribirlo.

Ten en cuenta dar visibilidad a este enunciado si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *