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