向W版通报一下,已经研究出来了。假设一个表叫T1.DBF,里面有6条记录。其中4条记录两两重复,另两条记录不重复,但这两条记录中有一条记录与重复记录中的一对是姓名相重。为了模拟案例中的效果,我另外加了两个字段:其它1和其它2。其它1字段不重复,而其它2字段对于重复的人来说也重复。
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
命令行是:
SELECT T4.* ;
FROM (
SELECT RECNO() 序号,T1.* ;
FROM T1) T4 ;
JOIN (
SELECT MIN(T2.序号) 序号,T2.SfzXm ;
FROM (SELECT RECNO() 序号,身份证号+姓名 SfzXM ;
FROM T1) T2 ;
GROUP BY T2.SfzXm) T3 ;
ON
T4.序号=T3.序号
其中,红色部分用来把各条记录的记录号弄成一个字段记录下来。这一步相当重要,后面比对就是靠记录号匹配(因为身份证号和姓名有重复的话,一匹配就是多条记录,达不到过滤的目的,而记录号始终是唯一的);绿色部分是从6条记录中筛选出身份证号+姓名不重复的第一条记录,也就是重复记录中记录号最小的那条。经过绿色部分的运行后,就生成一个比对的基准表—T3;桔色部分就是用原表记录号去匹配基准表的记录号,只有在基准表中存在记录号的记录才会被最后输出,也就达到了目的。之所以要固定记录号,一方面是因为这种不是全部字段都重复的记录无法用DISTINCT关键字过滤,只能靠记录号比对;另一方面则是记录号在命令执行中是滚动的,无法直接比对,只有把它化成一个字段的值固定下来才可以。
这种解决方法适用于记录数、字段数比较多,而只有其中极少数字段不重复,无法用DISTINCT关键字过滤的场合。你可以不用去管哪些字段重复、不重复,只要抓住你想过滤的字段即可。