查看: 7475|回复: 9

[原创] 如何通过SQL语句得出两个表的记录是否完全一致

[复制链接]
论坛徽章:
1
茶鸡蛋
日期:2011-05-26 14:53:25
跳转到指定楼层
1#
发表于 2010-4-9 23:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我想问一下:如何通过SQL语句得出两个表的记录是否完全一致?
比如:
       表A:1,a
               2,b

       表B:1,a
               2,b

则:表A = 表B
论坛徽章:
3
2009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:20:05
2#
发表于 2010-4-10 12:31 | 只看该作者
这样行不行,用2遍ANTI-JOIN求count(),然后求和看是不是0

使用道具 举报

回复
论坛徽章:
3
2009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:20:05
3#
发表于 2010-4-10 12:32 | 只看该作者
貌似也不行,如果某张表有重复记录,join体现不出来

使用道具 举报

回复
论坛徽章:
1
茶鸡蛋
日期:2011-05-26 14:53:25
4#
 楼主| 发表于 2010-4-13 00:13 | 只看该作者
我有一种方法:求差集。即A-B为空且B-A为空,得到A=B。大家看看有没问题,我感觉好像没啥问题!

select c1,c2
from    A
except
select c1,c2
from    B
;


select c1,c2
from    B
except
select c1,c2
from    A
;


--若上面两条SQL查出的结果为空,则A=B

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
5#
发表于 2010-4-13 02:48 | 只看该作者
D:\Program Files\IBM\SQLLIB97_1\BIN>db2 "select c1,c2 from t1 except select c1,c
2 from t2"

C1          C2
----------- -----------

  0 record(s) selected.


D:\Program Files\IBM\SQLLIB97_1\BIN>db2 "select c1,c2 from t2 except select c1,c
2 from t1"

C1          C2
----------- -----------

  0 record(s) selected.


D:\Program Files\IBM\SQLLIB97_1\BIN>db2 "select * from t1"

C1          C2
----------- -----------
          1           1
          2           1

  2 record(s) selected.


D:\Program Files\IBM\SQLLIB97_1\BIN>db2 "select * from t2"

C1          C2
----------- -----------
          1           1
          1           1
          2           1

  3 record(s) selected.


D:\Program Files\IBM\SQLLIB97_1\BIN>

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
6#
发表于 2010-4-13 11:26 | 只看该作者
如果oracle
spool t
select a,b from t order by a,b
spool off

spool t1
select a,b from t1 order by a,b
spool off

然后比较t和t1文件是否一致

使用道具 举报

回复
论坛徽章:
512
2012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26股神
日期:2012-01-05 10:29:02天枰座
日期:2015-09-16 09:05:30指数菠菜纪念章
日期:2015-07-01 16:40:43喜羊羊
日期:2015-06-30 09:06:18指数菠菜纪念章
日期:2015-04-02 09:22:462015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11指数菠菜纪念章
日期:2015-01-04 11:09:18
7#
发表于 2010-4-13 15:28 | 只看该作者

回复 #5 wangzhonnew 的帖子

如果某张表有重复记录,join体现不出来

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-03-01 11:19:07ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
8#
发表于 2010-4-29 23:13 | 只看该作者
1、分别查询两个表,检查总记录数是否相同
2、若相同,则两个表使用UNION去除重复取记录数
3、若三次查询得到值相同,则两个表数据完全一致

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-03-01 11:19:07ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
9#
发表于 2010-4-30 13:15 | 只看该作者
SELECT coalesce(sum(CASE WHEN num1 = 0 AND num2 = 1 THEN 0 ELSE 1 END), 0)
  FROM (
        SELECT sum(CASE WHEN num1 = num2 THEN 0 ELSE 1 END) num1, count(1) num2
          FROM (
                SELECT DISTINCT num1, sum(num3) over(PARTITION BY num1) num2
                  FROM (
                        SELECT count(1) over() num1, rang() over(order by a.c1) num2, count(1) over(PARTITION BY a.c1) num3,a.* FROM t1 a
                        UNIOM
                        SELECT count(1) over() num1, rang() over(order by a.c1) num2, count(1) over(PARTITION BY a.c1) num3,a.* FROM t2 a
                       ) t      
               ) t      
       ) t

若查询结果为0则表示表t1和表t2数据相同,若为1则表示表t1和表t2数据存在差异

注:c1为两个表的第一列

使用道具 举报

回复
论坛徽章:
176
现任管理团队成员
日期:2011-05-07 01:45:08版主7段
日期:2012-07-05 02:21:03ITPUB长老会成员
日期:2015-05-07 15:11:10ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB牛人
日期:2010-10-25 12:41:322010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:19
10#
发表于 2010-5-2 10:55 | 只看该作者
原帖由 〇〇 于 2010-4-13 11:26 发表
如果oracle
spool t
select a,b from t order by a,b
spool off

spool t1
select a,b from t1 order by a,b
spool off

然后比较t和t1文件是否一致

用文本编辑器比较也不错,如果数据量小

DB2有except,可以用一下试试

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表