日期:2014-05-18  浏览次数:20755 次

求对比两表记录差异的SQL语句!
A、B两表,表结构一样,A表为原始表。B表为更新表,B表内可能增删记录,也可能更新某个字段的值。现在需要一条SQ语句,能对比A表检测出B表中更新以及增删的数据。删除的可以用一个字段表示,或先不用取出删除的数据。
各位帮忙啊!

------解决方案--------------------
如A,B两表.

前提:表中不能有text、ntext、image、cursor 数据类型的字段。

用CheckSum()最简单:

select count(*) from
(
select * from A where checksum(*) in (select checksum(*) from B)
) t
select count(*) from A

如果两值一样,表示A,B两表数据相同.
------解决方案--------------------
select * from A where checksum(*) not in (select checksum(*) from B)

表示是A表有,B表没有的数据.

------解决方案--------------------
一个简单的例子:
——————————————————————————————————————————

create table A(ID int,Name varchar(20))
create table B(ID int,Name varchar(20))

insert into A select 1, 'AAAAAA '
insert into A select 2, 'BBBBBB '
insert into A select 3, 'CCCCCC '
insert into A select 4, 'DDDDDD '
insert into A select 5, 'EEEEEE '
insert into A select 6, 'FFFFFF '

insert into B select 1, 'AAAAAA '
insert into B select 2, 'GGGGGG '
insert into B select 3, 'CCCCCC '
insert into B select 4, 'HHHHHH '
insert into B select 6, 'FFFFFF '
go


select
A.ID,(case when B.ID is null then '删除 ' else '更新 ' end) as 状态
from
A
left join
B
on
A.ID=B.ID
where
A.Name <> isnull(B.Name, ' ')
go

/*
ID 状态
----------- ----
2 更新
4 更新
5 删除
*/

drop table A,B
go