作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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_IND= 'Y'
所以总计数 = 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;
在您的 ban='4444444444' 示例中,oms
中有 6 行,enab
中有 2 行匹配(不像您在描述中写的那样是 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
关于sql - 选择减去两个表的查询,如果子项中有更多数据,则不应考虑它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31683234/
我是一名优秀的程序员,十分优秀!