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逻辑

解决方案 »

  1.   

    牛逼逻辑总得遵循SQL运行原理吧,这么大的数据量,执行时间难免会长一点。
      

  2.   


    select * from a where orderno in (
    select  orderno from b
    group by orderno having count(1)=1)如楼上所说,再牛逼也得按规矩来。这个样子差不多了。另外在a表单号和b表单号上都加上索引吧,a表单号应该是唯一索引。
      

  3.   

    你这个 count(1)=1 是啥意思?
      

  4.   

    SELECT * FROM A t WHERE NOT EXISTS (SELECT 'x' FROM B WHERE oderno=t.oderno AND action!='M')
      

  5.   

    SELECT * FROM A t WHERE NOT EXISTS (SELECT 'x' FROM B WHERE oderno=t.oderno AND action!='M')你这个我试验过了,这么大的表,只能出来前100条数据,后面的不知道为啥出不来
      

  6.   

    牛B的逻辑 得有牛B的表结构来配合 你这表结构显然太简单,没什么牛B的逻辑发挥的地方
      

  7.   

    Create a materlized view on table B, such as:CREATE MATERIALIZED VIEW my_simple
    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)
      

  8.   

    select b.*
    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;