表结构:
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万多)有什么好的方法可以提高效率?用视图?存储过程?还是其他什么方法能使效率高一些?
谢谢各位大侠!我就这点分了,全部奉上!
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万多)有什么好的方法可以提高效率?用视图?存储过程?还是其他什么方法能使效率高一些?
谢谢各位大侠!我就这点分了,全部奉上!
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....
b表根据LastTime应该有维护,作partition或把过久的数据转移到一个履历表中
还是谢谢你!
这个是不是少写了一个条件,就是根据时间,只取回B表中指定ID的最后一条数据(最新的数据)进行比对?还是我没有理解?对CaedID上是有索引的,
“b表根据LastTime应该有维护,作partition或把过久的数据转移到一个履历表中”
这句话不是特别明白
做个视图取得每个CardID对应最新的数据应该是个不错的选择
--视图
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
(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上创建索引试一下!
问题基本解决了,谢谢大家,另外想问tangren,统计和查询有什么区别?