表 Test 主键为(Userid 、 Pindex )
Userid Pindex ChkAdd ChkEdit ChkDelete
User1 1 1 0 1
User1 2 1 1 1
User1 3 1 1 1
User2 1 1 0 1
User2 2 1 1 1
User2 5 1 0 1
User2 6 1 1 1
User3 1 1 0 1
User3 6 1 1 1
User4 1 1 0 1
User4 6 1 1 1
........
效果1:User1 和User2,User3...的後面的數據比较是否相同(包括行數是否相同和後面对应的字段的值是否相同),如果相同return 1 否则 return 0
效果2:User1 和User2,User3...的後面的數據比较是否相同(包括行數是否相同和後面对应的字段的值是否相同),如果相同: 如上表中的User4 与User3 重复,在Test表中將Userid = User4 的數據刪除掉
如果不同:則不做操作
依次把User1 ,User2,User3 遍历一遍
效果1:
1 create procedure usersameas
2 @userid varchar(10)
3 as
4 if exists
5 (select f.userid
6 from test f
7 where not exists (
8 select pindex, chkadd, chkedit, chkdelete
9 from test
10 where userid = f.userid or userid = @userid
11 group by pindex, chkadd, chkedit, chkdelete
12 having count(*) = 1)) select 1 else select 0
13
14 usersameas 'User1' --返回0
15
16 usersameas 'User3' --返回1
效果2: 不必这么麻烦一条语句就可以了。
1 delete test
2 where userid in(
3 select g.userid
4 from test g
5 where exists (
6 select f.userid
7 from test f
8 where f.userid < g.userid and not exists (
9 select pindex, chkadd, chkedit, chkdelete
10 from test
11 where userid = f.userid or userid = g.userid
12 group by pindex, chkadd, chkedit, chkdelete
13 having count(*) = 1)))
非常感谢,我自己苦弄半天,写的是一个一个对比的,比较烦,很费时间
@maanshancss: 哈哈,我也是灵光一闪。平时可能写不出这个语句的。也不知道效率怎么样
不是很理解你的比较是什么意思?希望你能够列一个效果表出来
效果表1: 0
效果表2:
User1 1 1 0 1
User1 2 1 1 1
User1 3 1 1 1
User2 1 1 0 1
User2 2 1 1 1
User2 5 1 0 1
User2 6 1 1 1
User3 1 1 0 1
User3 6 1 1 1
........
--(User4 刪掉)
需要用数据库比较工具才可以,前些日子,有人发过类似的博客,而且还是首页里,你找找看吧。
用Red Gate的话就只能一个用户一个用户的比较,还需要设定一些东西,数据多比较繁琐
不过在找比较数据的时候用Red Gate 比较好一些,颜色区分很明显,谢谢