es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Oracle SQL – Descartar selección externa si la selección interna devuelve null, y evitar múltiples filas

Pre-Información: En nuestra empresa, una persona es marcada con un asterisco (*) si está trabajando activamente. También hay personas que han cambiado de departamento.

Para un informe, utilizo 2 tablas llamadas COMPANY_PERSON_ALL y trifm_izinler4, uniendo el campo person_id de la siguiente manera:

Quiero descartar (no mostrar) la fila si la primera consulta interna devuelve nulo.
Y quiero evitar que la segunda consulta interna devuelva múltiples Departamentos.

select izn.person_id, izn.adi_soyadi, izn.company_id,
    (select a.employee_status from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id) as Status,
    (select a.org_code from COMPANY_PERSON_ALL a where a.person_id = izn.person_id) as Department,
    izn.hizmet_suresi, izn.kalan_izin
from trifm_izinler4 izn
where trunc(rapor_tarihi) = trunc(SYSDATE)

¿Puedes ayudarme a resolver estos 2 problemas de las consultas internas?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver el primer problema, donde la fila debe descartarse si la primera consulta interna devuelve null, podemos agregar una condición adicional en la cláusula WHERE para filtrar esas filas. La consulta actualizada se vería así:

    select izn.person_id, izn.adi_soyadi, izn.company_id,
        (select a.employee_status from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id) as Estado,
        (select a.org_code from COMPANY_PERSON_ALL a where a.person_id = izn.person_id and a.employee_status = '*') as Departamento,
        izn.hizmet_suresi, izn.kalan_izin
    from trifm_izinler4 izn
    where trunc(rapor_tarihi) = trunc(SYSDATE)
    and exists (select 1 from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id)
    

    Aquí, agregamos la condición “and exists…” para filtrar las filas en las que la primera consulta interna devuelve null.

    Para resolver el segundo problema, donde necesitamos evitar que la segunda consulta interna devuelva varios departamentos, podemos agregar una condición adicional en la cláusula WHERE para limitar los resultados solo a empleados activos. La consulta actualizada se vería así:

    select izn.person_id, izn.adi_soyadi, izn.company_id,
        (select a.employee_status from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id) as Estado,
        (select a.org_code from COMPANY_PERSON_ALL a where a.person_id = izn.person_id and a.employee_status = '*' and rownum = 1) as Departamento,
        izn.hizmet_suresi, izn.kalan_izin
    from trifm_izinler4 izn
    where trunc(rapor_tarihi) = trunc(SYSDATE)
    and exists (select 1 from COMPANY_PERSON_ALL a where a.employee_status = '*' and a.person_id = izn.person_id)
    

    Aquí, agregamos la condición “and rownum = 1” a la segunda consulta interna para limitar los resultados solo a la primera fila devuelta, que debería ser el departamento del empleado activo.

Comments are closed.