Несколько подзапросов с несколькими JOINS Oracle - PullRequest
0 голосов
/ 15 февраля 2020

У меня большой ORACLE SQL файл с несколькими объединениями и несколькими подзапросами. У меня проблемы с присоединением к двум из подзапросов. Я пробовал много разных методов, но самый близкий, который я получил, ниже. Часть, которая доставляет мне неприятности - это первая часть объединения с несколькими подзапросами (Дата окончания адреса и Дата окончания сотрудника. Я получаю сообщение об ошибке: ORA-00907: отсутствует правая скобка 00907. 00000 - "отсутствует правая круглая скобка ". Я не могу найти, где отсутствует правая круглая скобка, и я подозреваю, что это больше, чем та или иная проблема синтаксиса другого типа. У меня возникли проблемы с присоединением - две таблицы EMPLOYEE_EFF_DATE и таблица ADDRESS_EFF_DATE. Оба из этих таблиц есть поле EFF_DATE, и для обеих таблиц мне нужно получить запись с самой последней датой вступления в силу (по полю SSN). Я считаю, что я учел это с помощью метода ROW_NUMBER () OVER (PARTITION, но если более эффективный или простой способ сделать это, я абсолютно открыт для предложений.

/*Subscriber Code*/
    eed.P_COMPANY_ID_I as "Client Company ID"
    ,cs.REAL_SSN as "Employee SSN"
    ,cs.REAL_SSN as "Member SSN"
    ,'Subscriber' as "Person Type"
    ,eed.LAST_NAME as "Last Name"
    ,eed.FIRST_NAME as "First Name"
    ,eed.BIRTHDATE as "Date of Birth"
    ,eed.SEX as "Gender"
    ,aed.Address_1 as "Address 1"
    ,aed.Address_2 as "Address 2"
    ,aed.City
    ,aed.State
    ,aed.Zip
    ,aed.Country as "Country Code"
    ,aed.Telephone as "Employee Home Phone"
    ,eed.EMAIL_ADDRESS as "Employee Email Address"

    ,CASE 
        WHEN eed.controlled_group_status = 'L' 
        OR eed.controlled_group_status = 'P' 
        then eed.EFF_DATE
        ELSE NULL
    END
    as "Date Last Actively At Work"    
    /*Remove line below*/
    ,eed.CONTROLLED_GROUP_STATUS
    ,CASE  
        WHEN eed.controlled_group_status = 'L' 
        OR eed.controlled_group_status = 'P' 
        then 'LEAVE'
        ELSE NULL
    END
    as "Leave Status"
    ,CASE 
        WHEN eed.controlled_group_status = 'L' 
        OR eed.controlled_group_status = 'P' 
        then eed.EFF_DATE + 1   
        ELSE NULL
    END
    as "Leave Begin Date"
    ,eed.LATEST_HIRE_DATE as "Employee Date of Hire"
    ,eed.LAST_TERM_DATE as "Employee Date of Termination"
    ,mcemd.RATE_1 as "Employee Salary"
    ,ele.LIFE_EVENT_ID as "Life Event ID"
    ,ele.LIFE_EVENT_DATE as "Loss of Coverage Date"



FROM

/*Employee_Eff_Date*/
(SELECT *
FROM
(SELECT *
FROM
     (SELECT eed1.*,
             ROW_NUMBER() OVER (PARTITION BY eed1.SSN ORDER BY EFF_DATE DESC) as seqnum
      FROM EMPLOYEE_EFF_DATE eed1)
WHERE seqnum = 1) eed)

JOIN    
/*Address_Eff_Date*/
(SELECT *
FROM
    (SELECT *
    FROM
     (SELECT aed1.*,
             ROW_NUMBER() OVER (PARTITION BY aed1.SSN ORDER BY EFF_DATE DESC) as seqnum
      FROM ADDRESS_EFF_DATE aed1
     ) aed1
     ON aed1.SSN = eed.SSN
WHERE aed1.seqnum = 1) aed) 

INNER JOIN COMPANY_EMPLOYMENT_DATA ced
    ON eed.SSN = ced.SSN
INNER JOIN MV_COMB_EMP_MAX_DTS mcemd
    ON eed.SSN = mcemd.SSN
INNER JOIN EMPLOYEE_LIFE_EVENTS ele
    ON ele.SSN = eed.SSN


WHERE eed.P_COMPANY_ID_I = 1234

/*Address_Eff_Date qualifying statement*/
AND aed.ADDRESS_KEY = 0

/*EMPLOYEE_LIFE_EVENTS qualifying statement*/
/*Below line indicates the Life Event Dates (set to the past week)*/
AND ele.LIFE_EVENT_DATE >= sysdate-7
AND ele.LIFE_EVENT_DATE <= sysdate

1 Ответ

1 голос
/ 15 февраля 2020

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

/*Employee_Eff_Date*/
(SELECT *
FROM
     (SELECT eed1.*,
             ROW_NUMBER() OVER (PARTITION BY eed1.SSN ORDER BY EFF_DATE DESC) as seqnum
      FROM EMPLOYEE_EFF_DATE eed1) eed1
WHERE seqnum = 1) eed
JOIN    
/*Address_Eff_Date*/
(SELECT *
 FROM
     (SELECT aed1.*,
             ROW_NUMBER() OVER (PARTITION BY aed1.SSN ORDER BY EFF_DATE DESC) as seqnum
      FROM ADDRESS_EFF_DATE aed1
     ) aed1
     WHERE aed1.seqnum = 1) aed ON aed.SSN = eed.SSN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...