表结构:
A:
       CardID     RealMoney
          1          10.4
          2          22.8
          3          121.2
          4          22B:     CardID    UnstableMoney           LastTime
          1          10.4             2010-12-01 14:50:30
          1           9.4             2010-11-11 12:20:15
          2          12.1             2010-11-02 15:35:33
          2          11.2             2010-10-04 12:33:55
          3          121.2            2010-10-02 09:22:31 
根据上面的数据查询到的结果应该为:C:
      CardID        Money           LastTime 
         2           10.7     2010-11-02 15:35:33C表中的Money是根据A表中的money 减去 UnstableMoney得出的。但是也不一定是减去,如果B表中的值大于A表中的值时,就是B-A
    两个表,A,B。两个表同时都有CardID,Money字段,现在要查询当B表中的的CardID等于A表中的CardID时,B表中最后一条数据(根据时间判断)的Money字段上下差额大于5的数据,且时间在一定范围中的数据。另外B表中的数据较大(1000万多)有什么好的方法可以提高效率?用视图?存储过程?还是其他什么方法能使效率高一些?
谢谢各位大侠!我就这点分了,全部奉上!

解决方案 »

  1.   


    SELECT B.CardID,ABS(A.RealMoney-B.UnstableMoney) Money,B.LastTime
    FROM A,B
    WHERE A.CardID = B.CardID 
      AND ABS(A.RealMoney-B.UnstableMoney) > 5
      AND B.LastTime....
      

  2.   

    两个表CardID上有索引吧
    b表根据LastTime应该有维护,作partition或把过久的数据转移到一个履历表中
      

  3.   


    还是谢谢你!
    这个是不是少写了一个条件,就是根据时间,只取回B表中指定ID的最后一条数据(最新的数据)进行比对?还是我没有理解?对CaedID上是有索引的,
    “b表根据LastTime应该有维护,作partition或把过久的数据转移到一个履历表中”
    这句话不是特别明白
      

  4.   

    从你说的看来效率低就是b表数据太多了,同一个CardID有很多数据是吧
    做个视图取得每个CardID对应最新的数据应该是个不错的选择
      

  5.   


    --视图
    create or replace view v_b
    as
    select b1.* from b b1,
    (select b.cardid,max(b.lasttime) lasttime from b group by b.cardid) b2
    where b1.cardid = b2.cardid
      and b1.lasttime = b2.lasttimeSELECT V_B.CardID,ABS(A.RealMoney-V_B.UnstableMoney) Money,V_B.LastTime
    FROM A,V_B
    WHERE A.CardID = V_B.CardID 
      AND ABS(A.RealMoney-V_B.UnstableMoney) > 5
      

  6.   

      SELECT a.cardid,ABS(a.realmenoey-d.UnstableMoney) momey,d.lasttime FROM a INNER JOIN  
      (SELECT * FROM b WHERE b.lasttime IN(SELECT max(lasttime) FROM b GROUP BY cardid))d
      ON a.cardid=d.cardid WHERE ABS(a.realmenoey-d.UnstableMoney)>5;
    在b表上的card和lasttime上创建索引试一下!
      

  7.   


    问题基本解决了,谢谢大家,另外想问tangren,统计和查询有什么区别?