标题:请教删除重复记录
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
存在最大值(正数) 最小值(负数) 吗?

DO IT YOURSELF !
2015-03-24 09:10
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
重复记录是行记录(某两行所有字段记录重复)重复,还是某一字段的记录重复。最好上传数据表看看。

坚守VFP最后的阵地
2015-03-24 09:22
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
将当前记录COPY TO ARRAY,再ASORT()数组,有重复的就好清楚了。
2015-03-24 09:52
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
PACK命令能不用最好不用,更不要在每次DELETE命令后就PACK。
PACK命令会重建表文件,运行效率低,要求独占表,临时表也不能用。
可用ZAP和APPEND FROM 命令代替,ZAP命令只是将表文件结束标志放到表数据记录头,运行效率较高。
示例:
程序代码:
CLEAR
SET SAFETY OFF

CREATE CURSOR 表 (列1 I, 列2 I, 列3 I, 列4 I)
INSERT INTOVALUES (1, 2, 3, 4)
INSERT INTOVALUES (5, 6, 5, 8)
INSERT INTOVALUES (9, 10, 11, 12)
INSERT INTOVALUES (13, 14, 15, 14)

SCAN
    COPY TO ARRAY a表 FIELDS LIKE* NEXT 1
    DIMENSION  a表[ALEN(a表)]
    ASORT(a表)
    n列 = NULL
    FOR EACH Ai IN a表
        IF ai == n列
            DELETE
            EXIT
        ELSE
            n列 = ai
        ENDIF
    ENDFOR
ENDSCAN
*PACK    && 自由表用

CREATE CURSOR 表2 (列1 I, 列2 I, 列3 I, 列4 I)
APPEND FROM DBF("表") FOR !DELETED()
SELECT 表
ZAP
APPEND FROM DBF("表2")
BROWSE
2015-03-24 11:32
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
得分:0 
回复 12楼 sdta
哦,像以下的第一行要删除,第三行要删除
列1    列2    列3    列4    列5    列6    列7    列8
-6    -24    2    -8    -24    -2    -16    -8
-6    -24    2    -10    -22    -2    -14    -10
-6    -24   -2    -12    -20    -2    -12    -12
-6    -24    2    -17    -19    -2    -11    -13

2015-03-24 12:04
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
得分:0 
回复 14楼 吹水佬
先生您好,就以8列为例,我运用您给的代码,可运行下来“原表”中没有删除一条记录中有相同数值的这一行,谢谢先生指点(原表及代码在附件中),谢谢
求教.zip (9.05 KB)
2015-03-24 12:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
以下是引用fdxxhjc在2015-3-24 12:24:29的发言:

先生您好,就以8列为例,我运用您给的代码,可运行下来“原表”中没有删除一条记录中有相同数值的这一行,谢谢先生指点(原表及代码在附件中),谢谢

看你的示例只有一条数据记录:原表 VALUES (1, 2, 3, 4, 5, 6, 7, 8)
试试这样直接取原表数据:
程序代码:
CLEAR
SET TALK OFF 
SET SAFETY OFF

CREATE CURSOR 表 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I, 列7 I, 列8 I)
APPEND FROM 原表.dbf

SCAN
    COPY TO ARRAY a表 FIELDS LIKE* NEXT 1
    DIMENSION  a表[ALEN(a表)]
    ASORT(a表)
    n列 = NULL
    FOR EACH ai IN a表
        IF ai == n列
            DELETE
            EXIT
        ELSE
            n列 = ai
        ENDIF
    ENDFOR
ENDSCAN
*PACK    && 自由表用

CREATE CURSOR 表2 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I, 列7 I, 列8 I)
APPEND FROM DBF("表") FOR !DELETED()
SELECT 表
ZAP
APPEND FROM DBF("表2")
GO TOP 
BROWSE
2015-03-24 14:50
wangke508
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2015-3-27
得分:0 
好复杂 真难呀
2015-03-27 10:54
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
得分:0 
这还不简单啊,把行转换为列来考虑。

select reccno() as 行号,列1 as 值 from tablename
union all
select reccno() as 行号,列2 as 值 from tablename
........

最后select 行号,count(值) as 重复个数 from tablename group by 行号 having count(值)>=2 不就出来了吗?
2015-03-28 12:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443005-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.353809 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved