| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5303 人关注过本帖
标题:删除重复记录并保留其中记录号最大的一条,用 sql 语如何写
只看楼主 加入收藏
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11826
专家分:43421
注 册:2006-5-13
收藏
得分:0 
现在大家的水平都提高了,有了达到目的的代码还不算,有些还要求用一条语句来实现。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-04-30 07:52
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
楼主,你试试这条命令(未经测试,假设字段AA有重复值,需要筛选):
SELECT AA FROM ;
   (SELECT MAX(ID),AA ;
       FROM (SELECT RECNO() ID, AA FROM 源表文件名) ;
       GROUP BY AA) T1 ;
   INTO TABLE 新表文件名
2014-04-30 08:22
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:657
专家分:2177
注 册:2014-2-7
收藏
得分:0 
我的体会是:从代码的可读性来说,不要刻意追求用一条代码去实现所要的功能。有时候,用多条语句去实现,无论是可读性还是运行效率,反而更好。

本人的水平有限,在阅读如下语句时,也感到很吃力:
DELETE T FROM (SELECT * FROM T WHERE ;
B IN (SELECT B FROM T GROUP BY B HAVING COUNT(B)>1) ;
AND A NOT IN (SELECT MAX(A) FROM T GROUP BY B HAVING COUNT(B)>1)) A WHERE T.A=A.A


最近,本人在拜读 Taifu945 版主的《Visual Foxpro 入门手册》第 4 版,该书的绝大部分内容都适合于初学者,是一本不可都得的好书。但是在讲述 SQL 时,有些 SQL 实例有点复杂,SQL 语句太长了,说句心里话,那么长的 SQL 语句,在阅读之前就有点害怕的感觉。一点意见,希望作者不要介意。

泉城飞狐
2014-04-30 08:31
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2014-4-30 08:31:52的发言:

我的体会是:从代码的可读性来说,不要刻意追求用一条代码去实现所要的功能。有时候,用多条语句去实现,无论是可读性还是运行效率,反而更好。

本人的水平有限,在阅读如下语句时,也感到很吃力:
DELETE T FROM (SELECT * FROM T WHERE ;
B IN (SELECT B FROM T GROUP BY B HAVING COUNT(B)>1) ;
AND A NOT IN (SELECT MAX(A) FROM T GROUP BY B HAVING COUNT(B)>1)) A WHERE T.A=A.A

最近,本人在拜读 Taifu945 版主的《Visual Foxpro 入门手册》第 4 版,该书的绝大部分内容都适合于初学者,是一本不可都得的好书。但是在讲述 SQL 时,有些 SQL 实例有点复杂,SQL 语句太长了,说句心里话,那么长的 SQL 语句,在阅读之前就有点害怕的感觉。一点意见,希望作者不要介意。
不介意,不介意,长SQL只是为了讲述子查询举例而已。如果理解了其结构原理,完全可以按自己的思路拆分。
2014-04-30 08:59
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
以下是引用sylknb在2014-4-29 22:38:08的发言:

DELETE T FROM (SELECT * FROM T WHERE ;
B IN (SELECT B FROM T GROUP BY B HAVING COUNT(B)>1) ;
AND A NOT IN (SELECT MAX(A) FROM T GROUP BY B HAVING COUNT(B)>1)) A WHERE T.A=A.A
MESSAGEBOX(_TALLY)
请班主介释一下代码的原理,谢谢!

自己先把代码拆分一下,然后再运行代码看看结果就明白了。

坚守VFP最后的阵地
2014-04-30 11:23
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
既然楼主对SELECT-SQL掌握的不好,那就用VFP命令写代码吧,不要片面追求一句SQL命令了。

坚守VFP最后的阵地
2014-04-30 11:28
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
以下是引用liuxingang28在2014-4-29 21:14:40的发言:

假设表 table1 有一字段 empid C(10),现在要删除字段 empid 中重复的记录,仅保留记录号最大的一个,纯 VFP 代码如下:

select 0
use table1
index on empid+str(recn()) tag empid desc
go top
do while not eof()
    m.cTmp = empid
    skip
    if empid = m.cTmp
        delete rest while empid = m.cTmp
    endif
enddo

保留的是相同内容中的最小记录号的内容,而不是最大记录号的内容。

坚守VFP最后的阵地
2014-04-30 12:06
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
程序代码:
Create Cursor T (Kh C(3))
Insert Into T Values ("001")
Insert Into T Values ("001")
Insert Into T Values ("002")
Insert Into T Values ("003")
Insert Into T Values ("001")
Insert Into T Values ("003")
Insert Into T Values ("002")
Insert Into T Values ("001")
Insert Into T Values ("002")
Insert Into T Values ("001")
Index on kh+Str(Recno(),Len(Transform(Reccount()))) Tag kh
Go Top 
Do While Not Eof()
   lckh=kh
   Skip 
   If kh=lckh
      Skip -1
      Delete Record Recno()
      Skip 
   Endif 
Enddo 
Set Order To 
Browse

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 sdta 于 2014-4-30 12:12 编辑 ]

坚守VFP最后的阵地
2014-04-30 12:07
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:657
专家分:2177
注 册:2014-2-7
收藏
得分:0 
以下是引用sdta在2014-4-30 12:06:06的发言:

 
保留的是相同内容中的最小记录号的内容,而不是最大记录号的内容。
sdta 版主,我的代码是没有问题的。注意:在建立索引时,是按照降序排序的。index on empid+str(recn()) tag empid desc

泉城飞狐
2014-04-30 12:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
回复 19 楼 liuxingang28
抱歉,没注意后面的DESC

坚守VFP最后的阵地
2014-04-30 13:03
快速回复:删除重复记录并保留其中记录号最大的一条,用 sql 语如何写
数据加载中...
 
   



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

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