如何快速找出表中变化部分的数据?
大家好:
现有一张表叫MyTable, 其中有三列ColA, ColB和ColC
数据类似如下:
ColA ColB ColC
-------------------------------------------------------
2013-3-18 B0 1.70
2013-3-18 B1 2.50
2013-3-18 B2 3.60
2013-3-18 B3 4.70 (删除)
...
2013-5-1 B0 1.70
2013-5-1 B1 2.50
2013-5-1 B2 3.65 (修改)
2013-5-1 B4 5.58 (新增)
...
由于数据较多20W左右,要找出这张表中二个不同日期的有差异性的数据,
也就是要找出对于2013-5-1来说,新增或修改或删除了的数据, 没变化的过滤掉:
2013-3-18 B3 4.70 (删除)
2013-5-1 B2 3.65 (修改)
2013-5-1 B4 5.58 (新增)
=========================================
问题:
1. 如何快速地找出这样的数据?(怎样才效率更高!!!!)
2. 对同一张表MyTable进行left join 或 right join时,结果和inner join的都一样,为什么?
如:
select o.ColC as OldC, n.ColC as NewC
from MyTable o
left join MyTable n on (n.ColB=o.ColB)
where o.ColA='2013-3-18' and n.ColA='2013-05-01'
先谢谢大家。
------解决方案--------------------对一个集合(1,3)去交集和并集。结果应该是一样的。
------解决方案--------------------问题一:不知道你要干嘛(删除了的数据,你还能查出来?)
问题二: select o.ColC as OldC, n.ColC as NewC
from MyTable o
left join MyTable n on (n.ColB=o.ColB)
where o.ColA='2013-3-18' and n.ColA='2013-05-01' ---原因在这个where 条件
select o.ColC as OldC, n.ColC as NewC
from MyTable o
left join MyTable n on (n.ColB=o.ColB)
and o.ColA='2013-3-18' and n.ColA='2013-05-01' --当你把把where东西放在on后面 结果就不一定一样了
这个你可以去看看sql2005技术内幕这本书。里面有介绍 ,一条完整的sql 的每个动作产生一个临时结果集,
并且有先后顺序的。具体顺序是什么我也忘了
------解决方案--------------------你的这个设计不好,换个思路,做个触发器,把你要的数据存到另一个表里面去吧
------解决方案--------------------个人认为应该在每天0点生成一张临时表比较好! 只有一张表怎么比较啊!!
这样进行比对 通过左连接 查出修改和新增的表 通过右连接查出删除的表
------解决方案--------------------这种情况,你要给个统计时间才好统计,比如:一个月统计一次。这样才会有比较吗。才可以比较出表的变化。
Left join 与 Inner Join 的区别:http://zhidao.baidu.com/question/407984766.html
至于Left Join的时候,执行顺序是On先执行,Where后执行,但是On条件删除的行有可能会再次添加回来,Where条件删除的行永久的。