簡體   English   中英

具有多個連接的多個子查詢 Oracle

[英]Multiple Sub Queries with Multiple JOINS Oracle

我有一個包含多個連接和多個子查詢的大型 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

我想你真的想要這個。 請注意,您的查詢嵌套級別高於實際需要的級別,我已刪除了額外的查詢嵌套:

/*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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM