SQL 两个相同结构表对比内容,并显示差异。

两表名称为A和B,内容为下图:

需对比的列为:inv_no,wstation_no,st_no,mat_no,p_unit,p_quan,p_weight,avg_cost,p_avg_cost,virt_if,em_if
(其实就是VER_NO,LINE_NO,LINE_ID这三列可以忽略)

条件:
1、mat_no这个列,A表中存在,B表不存在(B表存在而A表不存在)。
可以用两个临时表对比,并且一起显示,如下图。(A表存在,而B表不存在)

2、如A和B表都同时存在相同的MAT_NO,请列出该相同MAT_NO行其他不同的地方,并显示。

注释:
其实就是一个产品的BOM(物料清单),inv_no字段为成品,mat_no字段是材料名称。
问题症结在于,材料可能会随机变动,变动在SQL表里体现的方式是新增或者删除。现在需要将变动前和变动后的数据进行对比,显示出变动的是什么地方。
1、是新增材料还是减少材料,如果是新增的话,是新增了什么东西。(减少亦同)
2、是否修改,修改了哪个字段

恳请各位前辈帮忙,跪谢。

第1个回答  2013-07-22
第一个比较简单,有个语句结构块可以解决;或者用 Exists加关联也行;
第二个看起来应该是要建立在一个历史数据比对上的,你说的这两个表一个是实时的,一个是历史的?如果是,那第二个的第1个问题直接比对就可以了,这个也好解决~
重点想要关注学习下第2个,这个以前我也遇到过这样的困扰,当时字段太多有好几百个,后来协商重点记录了十多个字段,是在Trigger里完成的。也是相当于没有找到终极方案~追问

第二个,我的思路是用游标一个一个比对。耗时耗资源也没办法,但是游标我不太会用……
所以上来求助了。

追答

你的意思是用游标把一整笔记录所有字段都取出来,然后当做游标的提取变量进行比对吗。字段少的话还好,多的话就不好用了。
我一般不用游标,需要遍历数据的时候,我都是用While循环,给需要遍历的数据集设定一个RowNumber序号字段,以这个字段做递增循环遍历。

给你一段游标用法参考:
DECLARE UpdateQnty_Cursor_mubiao1 INSENSITIVE CURSOR
FOR select mockOUT,qnty
from #tmpIssueMock
where proccode= @proccode ---定义游标的数据集

OPEN UpdateQnty_Cursor_mubiao1 ---开始游标
BEGIN
FETCH NEXT FROM UpdateQnty_Cursor_mubiao1 INTO @TmpmockOUT,@mockqnty --变量个数与数据集字段数相等
WHILE @@FETCH_STATUS = 0
BEGIN
--
/*游标内语句块 */
--
FETCH NEXT FROM UpdateQnty_Cursor_mubiao1 INTO @TmpmockOUT,@mockqnty --变量个数与数据集字段数相等
END
END
CLOSE UpdateQnty_Cursor_mubiao1
DEALLOCATE UpdateQnty_Cursor_mubiao1

第2个回答  2013-07-22
oracle有几个函数,minus是取不相交集,intersect 取交际
第3个回答  2013-07-22
大概能明白的你的意思,你需要一个可以记录商品参数变更的历史轨迹.
这个很简单,在调整的时候,插入调整的数据进去就好了.正就加加 负就减
你每次查询的时候分类做group by 就好了.
我之前做的保险公司的保单续期缴费 大概就是这样的.追问

和您说的还是有一点区别,我这个只是单纯的比对变更前和变更后有什么差别,而这个差别又在什么地方。

追答

这个交给程序去做记录比较合算.

追问

呵呵,我搜索了各种工具,都需要将表导到文本文件进行然后再用软件进行对比。

而实际工作中,太耗费时间了。这样还不如EXCEL直接对比来的快捷。

追答

确实是这样的,如果是有限的工作,不妨换一种思路.你做的非常正确.

追问

谢谢您的热心回答,目前我只能做到对比出哪条数据不一样,还是对比不出不相同的那一条数据差异究竟在什么地方。

楼下的朋友也谢谢您了。

本回答被提问者和网友采纳