Условное внутреннее соединение в базе данных oracle

#sql #oracle

Вопрос:

Я хочу, чтобы внутреннее соединение происходило только в том случае, если в таблице, подлежащей «внутреннему соединению», есть строка, имеющая ссылку на строку в основной таблице (ту, которую я буду использовать в FROM выражении), как я могу это сделать ?

это мой вопрос:

 SELECT DISTINCT IT_AC.DS_OBSERVACAO_GERAL, IT_AC.SN_ATENDIDO, IT_AC.SN_ENCAIXE,
    IT_AC.CD_IT_AGENDA_CENTRAL,IT_AC.CD_AGENDA_CENTRAL, IT_AC.HR_AGENDA, IT_AC.CD_USUARIO AS "CREATED_BY", 
    IT_AC.CD_ITEM_AGENDAMENTO, PACI.NR_CPF, PACI.NM_PACIENTE,PACI.CD_PACIENTE,PRT.NM_PRESTADOR,PRT.CD_PRESTADOR,
    PACI.NR_CELULAR,PACI.NR_FONE,PACI.NR_DDD_CELULAR,PACI.NR_DDD_FONE, 
    CON.NM_CONVENIO,CON.CD_CONVENIO, IT_AG.DS_ITEM_AGENDAMENTO, ESP.DS_ESPECIALID,ESP.CD_ESPECIALID, TIP_MAR.DS_TIP_MAR, TIP_MAR.CD_TIP_MAR,LOG_O_A_C.TP_OPERACAO
FROM IT_AGENDA_CENTRAL IT_AC
    INNER JOIN AGENDA_CENTRAL AC
        ON AC.CD_AGENDA_CENTRAL = IT_AC.CD_AGENDA_CENTRAL
    INNER JOIN PACIENTE PACI
        ON IT_AC.CD_PACIENTE = PACI.CD_PACIENTE
    INNER JOIN PRESTADOR PRT
        ON AC.CD_PRESTADOR = PRT.CD_PRESTADOR
    INNER JOIN ITEM_AGENDAMENTO IT_AG
        ON IT_AG.CD_ITEM_AGENDAMENTO = IT_AC.CD_ITEM_AGENDAMENTO
    INNER JOIN ESP_MED 
        ON ESP_MED.CD_PRESTADOR  = AC.CD_PRESTADOR
    INNER JOIN ESPECIALID ESP 
        ON ESP.CD_ESPECIALID = ESP_MED.CD_ESPECIALID
    INNER JOIN CONVENIO CON
        ON CON.CD_CONVENIO = IT_AC.CD_CONVENIO
    INNER JOIN TIP_MAR
        ON  TIP_MAR.CD_TIP_MAR = IT_AC.CD_TIP_MAR
    INNER JOIN LOG_OPERA_AGENDA_CENTRAL LOG_O_A_C
        ON IT_AC.CD_IT_AGENDA_CENTRAL = LOG_O_A_C.CD_IT_AGENDA_CENTRAL
WHERE PACI.NR_CPF = ${stringCPF}
ORDER BY TRUNC(IT_AC.HR_AGENDA) ASC
OFFSET ${offset} ROWS FETCH NEXT ${limit} ROWS ONLY
 

не все строки в IT_AC имеют ссылку на строку в LOG_O_A_C , но даже если я хочу их получить. Как я могу это сделать ?

Комментарии:

1. Вы имеете в виду ВНЕШНЕЕ СОЕДИНЕНИЕ?

Ответ №1:

вам нужно использовать «внешнее соединение»:

 SELECT
    DISTINCT IT_AC.DS_OBSERVACAO_GERAL,
    IT_AC.SN_ATENDIDO,
    IT_AC.SN_ENCAIXE,
    IT_AC.CD_IT_AGENDA_CENTRAL,
    IT_AC.CD_AGENDA_CENTRAL,
    IT_AC.HR_AGENDA,
    IT_AC.CD_USUARIO AS "CREATED_BY",
    IT_AC.CD_ITEM_AGENDAMENTO,
    PACI.NR_CPF,
    PACI.NM_PACIENTE,
    PACI.CD_PACIENTE,
    PRT.NM_PRESTADOR,
    PRT.CD_PRESTADOR,
    PACI.NR_CELULAR,
    PACI.NR_FONE,
    PACI.NR_DDD_CELULAR,
    PACI.NR_DDD_FONE,
    CON.NM_CONVENIO,
    CON.CD_CONVENIO,
    IT_AG.DS_ITEM_AGENDAMENTO,
    ESP.DS_ESPECIALID,
    ESP.CD_ESPECIALID,
    TIP_MAR.DS_TIP_MAR,
    TIP_MAR.CD_TIP_MAR,
    LOG_O_A_C.TP_OPERACAO
FROM
    IT_AGENDA_CENTRAL IT_AC
    INNER JOIN AGENDA_CENTRAL AC ON AC.CD_AGENDA_CENTRAL = IT_AC.CD_AGENDA_CENTRAL
    INNER JOIN PACIENTE PACI ON IT_AC.CD_PACIENTE = PACI.CD_PACIENTE
    INNER JOIN PRESTADOR PRT ON AC.CD_PRESTADOR = PRT.CD_PRESTADOR
    INNER JOIN ITEM_AGENDAMENTO IT_AG ON IT_AG.CD_ITEM_AGENDAMENTO = IT_AC.CD_ITEM_AGENDAMENTO
    INNER JOIN ESP_MED ON ESP_MED.CD_PRESTADOR = AC.CD_PRESTADOR
    INNER JOIN ESPECIALID ESP ON ESP.CD_ESPECIALID = ESP_MED.CD_ESPECIALID
    INNER JOIN CONVENIO CON ON CON.CD_CONVENIO = IT_AC.CD_CONVENIO
    INNER JOIN TIP_MAR ON TIP_MAR.CD_TIP_MAR = IT_AC.CD_TIP_MAR
    LEFT OUTER JOIN LOG_OPERA_AGENDA_CENTRAL LOG_O_A_C ON IT_AC.CD_IT_AGENDA_CENTRAL = LOG_O_A_C.CD_IT_AGENDA_CENTRAL
WHERE
    PACI.NR_CPF = $ { stringCPF }
ORDER BY
    TRUNC(IT_AC.HR_AGENDA) ASC OFFSET $ { offset } ROWS FETCH NEXT $ {
limit
    } ROWS ONLY