Внешнее объединение не работает для существующего запроса - PullRequest
1 голос
/ 20 сентября 2019

В приведенном ниже запросе мне нужны все номера людей, у которых нет записей в pay_dir_cards_f и, следовательно, в соответствующих pay_dir_card_components_f pay_dir_comp_details_f.

Я добавил внешнее соединение ниже, но я не получаю вышеуказанные требуемые записи.Вместо этого я получаю записи, которые находятся в таблице pay_dir_cards_f.Как я могу изменить внешнее объединение в приведенном ниже запросе.

Кроме того, обратите внимание, да, я действительно знаю, что этот стиль соединения является старым, и я должен использовать новое соглашение вместо этого, но я должен обновить существующий запрос, следовательноне использую его.

SELECT DISTINCT papf.person_number, 
                        PAPF.effective_start_date, 
                        PAPF.effective_end_date ,
                        paam.ASSIGNMENT_NUMBER 
        FROM   per_all_people_f papf, 
               per_all_assignments_m paam, 
               pay_pay_relationships_dn pprd, 
               pay_rel_groups_dn prgd, 
               pay_dir_cards_f pdcf, 
               pay_dir_card_components_f pdccf1, 
               pay_dir_comp_details_f pdcdf1 
        WHERE  SYSDATE BETWEEN papf.effective_start_date AND 
                               papf.effective_end_date 
               AND paam.person_id = papf.person_id 
               AND paam.effective_latest_change = 'Y' 
               AND paam.assignment_type IN ( 'E', 'C' ) 
               AND pprd.person_id = papf.person_id 
               --And PPRD.LEGISLATIVE_DATA_GROUP_ID = PLDGV.LEGISLATIVE_DATA_GROUP_ID  
               AND pprd.payroll_stat_unit_id = paam.legal_entity_id 
               AND prgd.payroll_relationship_id = pprd.payroll_relationship_id 
               AND prgd.assignment_id = paam.assignment_id 
               AND prgd.group_type = 'A' 
               AND pdcf.payroll_relationship_id(+) = 
                   prgd.payroll_relationship_id 
               AND Trunc(SYSDATE) BETWEEN paam.effective_start_date AND 
                                          paam.effective_end_date 
               AND Trunc(SYSDATE) BETWEEN papf.effective_start_date AND 
                                          papf.effective_end_date 
               AND Trunc(SYSDATE) BETWEEN pdcf.effective_start_date AND 
                                          pdcf.effective_end_date 
               AND pdccf1.dir_card_id(+) = pdcf.dir_card_id
               AND pdcdf1.dir_card_comp_id(+) = pdccf1.dir_card_comp_id 

               AND Trunc(SYSDATE) BETWEEN pdcdf1.effective_start_date AND 
                                          pdcdf1.effective_end_date 
               AND pdcdf1.effective_start_date BETWEEN 
                   pdccf1.effective_start_date AND pdccf1.effective_end_date 
        ORDER  BY papf.person_number

1 Ответ

0 голосов
/ 21 сентября 2019

Я понимаю, что вы ищете OUTER JOIN на pay_dir_cards_f и что это происходит не так, как вы ожидаете.

Соединение в старом стиле и плохое форматирование затрудняют чтение запроса ... Когдапри сканировании вашего запроса на наличие части, которая относится к pay_dir_cards_f условиям соединения, одно условие кажется проблематичным:

AND Trunc(SYSDATE) BETWEEN pdcf.effective_start_date AND pdcf.effective_end_date 

Я подозреваю, что Oracle может выполнить OUTER JOIN из-за (по крайней мере) этого условия,Существуют серьезные ограничения и предупреждения в отношении использования старых объединений, особенно OUTER JOIN s, которые, например, описаны в руководстве по 10g .

Я настоятельно рекомендую переписать запросиспользовать не древние соединения.Это, вероятно, просто заставит вашу проблему исчезнуть.

В знак доброй воли найдите ниже первую попытку перестроить (и переформатировать) запрос.Вам нужно будет просмотреть его и, возможно, исправить несколько ошибок, но это должно быть неплохой отправной точкой:

SELECT DISTINCT 
    papf.person_number, 
    papf.effective_start_date, 
    papf.effective_end_date ,
    paam.ASSIGNMENT_NUMBER 
FROM   
    per_all_people_f papf 
    INNER JOIN per_all_assignments_m paam
        ON  paam.person_id = papf.person_id 
        AND paam.effective_latest_change = 'Y' 
        AND paam.assignment_type IN ( 'E', 'C' ) 
        AND TRUNC(SYSDATE) BETWEEN paam.effective_start_date AND paam.effective_end_date        
    INNER JOIN pay_pay_relationships_dn pprd
        ON  pprd.person_id = papf.person_id 
        -- AND pprd.legislative_data_group_id = pldgv.legislative_data_group_id  
        AND pprd.payroll_stat_unit_id = paam.legal_entity_id 
    INNER JOIN pay_rel_groups_dn prgd
        ON  prgd.payroll_relationship_id = pprd.payroll_relationship_id 
        AND prgd.assignment_id = paam.assignment_id 
        AND prgd.group_type = 'A' 
    INNER JOIN pay_dir_cards_f pdcf
        ON  pdcf.payroll_relationship_id = prgd.payroll_relationship_id 
        AND TRUNC(SYSDATE) BETWEEN pdcf.effective_start_date AND pdcf.effective_end_date 
    LEFT JOIN pay_dir_card_components_f pdccf1
        ON  pdccf1.dir_card_id = pdcf.dir_card_id
        AND pdccf1.dir_card_id = pdcf.dir_card_id   
    LEFT JOIN pay_dir_comp_details_f pdcdf1 
        ON  TRUNC(SYSDATE) BETWEEN pdcdf1.effective_start_date AND pdcdf1.effective_end_date 
        AND pdcdf1.dir_card_comp_id = pdccf1.dir_card_comp_id 
WHERE  
    SYSDATE BETWEEN papf.effective_start_date AND  papf.effective_end_date 
    AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date AND papf.effective_end_date
ORDER  BY papf.person_number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...