2016-01-17 174 views
0

我能有一個像1298287 , 82727-2 , 8367-3,7363 etcLEFT OUTER JOIN在SQL查詢

數字我使用正則表達式來消除-2 -3從這些數字來獲取個人數列分配號。現在消除後,我需要將此人員號碼與另一個表格中的人員號碼進行比較。

當我爲此使用連接時,它檢索的行數較少。我在表xx_ass_table中有13000行,我需要work_stg表中的僱主名稱和工作人員類型,我需要將此人加入 ,其中人員編號從work_stg

select 
    assignment_name, 
    regexp_substr(assignment_name, '[0-9]+') person_number, 
    wrk.employer_name , 
    wrk.TIME, 
    STEP_ENTRY_DATE , 
    SYSTEM_PERSON_TYPE , 
    WORK_ATHOME_FLAG , 
    worker_category, 
    effective_start_date, 
    effective_end_date, 
from 
    (select 
     xx_ass_table.*, 
     COUNT(*) OVER (PARTITION BY assignment_name, 
            effective_start_date, 
            effective_end_date, 
            effective_latest_change) as c 
    from xx_ass_table) t, 
    xx_work_stg wrk 
where 
    regexp_substr(t.assignment_name(+), '[0-9]+') = wrk.person_number 
    and c = 1; 

xx_ass_table有幾個人號碼不屬於IB工作關係表,這就是爲什麼我使用左連接。但是這個查詢返回了4000行,當它返回13k行時。

+1

停止使用專有的'(+)'操作符。請使用適當的「LEFT JOIN」 - 即使Oracle建議。 –

回答

1

請儘量避免這種連接,並使用左外連接的正確語法,我不確定是否正確放置了PLUS標記。 試試這個:

select assignment_name, 
    regexp_substr(assignment_name, '[0-9]+') person_number, 
    wrk.employer_name , 
    wrk.TIME, 
    STEP_ENTRY_DATE , 
    SYSTEM_PERSON_TYPE , 
    WORK_ATHOME_FLAG , 
    worker_category, 
    effective_start_date, 
    effective_end_date, 

    from (SELECT xx_ass_table.*, 
      COUNT(*) OVER (PARTITION BY assignment_name, 
             effective_start_date, 
             effective_end_date, 
             effective_latest_change) as c 
    from xx_ass_table) t 
left outer join 
    xx_work_stg wrk 
on regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number