在SQL查询中的函数左外连接

时间:2016-01-17 08:00:13

标签: sql oracle

我有一个列号分配编号可以包含1298287 , 82727-2 , 8367-3,7363 etc

之类的数字

我正在使用正则表达式从这些数字中消除-2-3来检索人数。现在消除了这个后,我需要将这个人数与另一个表中的人数进行比较。

当我使用join时,它检索的行数较少。我在表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 个答案:

答案 0 :(得分: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