create table oms (run_date date,ban varchar2(10),DVR_IND char(1));

create table enab (run_date date,ban varchar2(10),DVR_IND char(1));

主表
    insert into oms values(trunc(sysdate),'1111111111','Y');
    insert into oms values(trunc(sysdate),'1111111111','Y');
    insert into oms values(trunc(sysdate),'1111111111','Y');
    insert into oms values(trunc(sysdate),'2222222222','Y');
    insert into oms values(trunc(sysdate),'3333333333','Y');
    insert into oms values(trunc(sysdate),'3333333333','N');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','N');
    insert into oms values(trunc(sysdate),'4444444444','N');

和子表:
    insert into enab values(trunc(sysdate),'1111111111','Y');
    insert into enab values(trunc(sysdate),'2222222222','Y');
    insert into enab values(trunc(sysdate),'3333333333','Y');
    insert into enab values(trunc(sysdate),'3333333333','Y');
    insert into enab values(trunc(sysdate),'3333333333','N');
    insert into enab values(trunc(sysdate),'4444444444','Y');
    insert into enab values(trunc(sysdate),'4444444444','N');
    insert into enab values(trunc(sysdate),'5555555555','N');

查询应返回以下记录:
    insert into oms values(trunc(sysdate),'1111111111','Y');
    insert into oms values(trunc(sysdate),'1111111111','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');
    insert into oms values(trunc(sysdate),'4444444444','Y');

所有记录的结果应具有dvr\u ind='y'
对于BAN1111111,OMS中的总计数为3,ENAB中的总计数为1,结果为(3-1)=2
对于BAN22222222222,OMS中的总计数为1,而ENAB中的总计数为1,则结果为(1-1)=0
对于BAN3333333333,OMS中的总计数为1,ENAB中的总计数为2,结果为(1-2)=0(因为我们需要考虑OMS表和DVR ind='y')
对于BAN4444444444,OMS中的总计数为4,ENAB中的总计数为1,结果为(4-1)=3
所以总计数是=2+0+0+3=5(我想得到这五条记录)

最佳答案

使用值枚举具有row_number()和左联接表的行,此计数器:

select run_date, ban, dvr_ind
    from (
      select o.*, o.rowid,
          row_number() over (partition by run_date, ban, dvr_ind order by null) rn
        from oms o) o
    left join (
      select e.*, e.rowid,
          row_number() over (partition by e.run_date, e.ban, e.dvr_ind order by null) rn
        from enab e) e using (run_date, ban, dvr_ind, rn)
    where e.rowid is null;

SQLFiddle demo
在ban='4444444444'的示例中,oms中有6行匹配,enab中有2行匹配(不像您在description中所写的那样是4行和1行)。
所以产量差别不大。
编辑:我没有注意到,您只对dvr_ind='y'的行感兴趣。因此,在两个子查询(或最后一行)中添加where dvr_ind = 'Y'
select run_date, ban, dvr_ind
    from (
      select o.*, o.rowid,
          row_number() over (partition by run_date, ban, dvr_ind order by null) rn
        from oms o where dvr_ind = 'Y') o
    left join (
      select e.*, e.rowid,
          row_number() over (partition by e.run_date, e.ban, e.dvr_ind order by null) rn
        from enab e where dvr_ind = 'Y') e using (run_date, ban, dvr_ind, rn)
    where e.rowid is null

10-04 11:16