table A :2千万条数据, table B: 2亿条数据A表结构单号 时间
111 2012-1
112 2012-2
113 2012-3
B表结构
单号 动作 时间
111 M 2012-1-1
111 N 2012-1-2
111 P 2012-1-3
111 Q 2012-1-4
112 M 2012-1-5
113 M 2012-1-6
113 N 2012-1-6当A表产生一条记录的时候,相应B表会产生一个对应单号的M动作的记录,求:在B表中只有一个动作M的单号和A表对应的相应信息。按照例子信息,得出112 2012-2 这一条记录。或者根据B表一个表,能查出112这一条记录也行各位大侠,因为两个表中数据量较大,所以正常逻辑虽然可以通过,但是会很很很很慢,能否给出牛B逻辑
111 2012-1
112 2012-2
113 2012-3
B表结构
单号 动作 时间
111 M 2012-1-1
111 N 2012-1-2
111 P 2012-1-3
111 Q 2012-1-4
112 M 2012-1-5
113 M 2012-1-6
113 N 2012-1-6当A表产生一条记录的时候,相应B表会产生一个对应单号的M动作的记录,求:在B表中只有一个动作M的单号和A表对应的相应信息。按照例子信息,得出112 2012-2 这一条记录。或者根据B表一个表,能查出112这一条记录也行各位大侠,因为两个表中数据量较大,所以正常逻辑虽然可以通过,但是会很很很很慢,能否给出牛B逻辑
select * from a where orderno in (
select orderno from b
group by orderno having count(1)=1)如楼上所说,再牛逼也得按规矩来。这个样子差不多了。另外在a表单号和b表单号上都加上索引吧,a表单号应该是唯一索引。
TABLESPACE uwdata
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS
SELECT * FROM B WHERE ACTION = 'M'
group by orderno having count(1)=1(create an index on action column)
from b
,(select dh,rq,count(*) over (partition by dh) cn
from a
where a.dz = 'M'
) a2
where a2.dh = b.dh and a2.rq = b.rq and a2.cn = 1;