SQL去重复查询

aled6825 2009-07-14 11:21:52
有一张Access的查询表,结果如下.

name Item value tag
John ITCH 89.33 1
John ITCH 33.22 2
Alex ITCH 67.77 3
Jacky ITCH 89.01 1
Alex YHTC 34.22 2
Bruce YHTC 35.11 2
Bruce YHTC 89.11 3
...

这张表有一个缺憾,在Item ITCH上,John有两笔记录(1/2),同样,在YHTC项目,Bruce也有两笔记录(2/3).这是不符合规则的.
目前需求是,对于同一个项目,每人只能取第一笔数据.也就是John tag2和Bruce tag3是不合法的,需要删除.
问题是,这张表已经是一张查询表了,那么该怎么编写SQL才能从这张表中删除不需要的数据?
注意,这是access的环境,oracle的一些SQL语句是失效的.
...全文
3848 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwl24 2012-02-12
  • 打赏
  • 举报
回复
这个问题我也没解决
aled6825 2009-07-26
  • 打赏
  • 举报
回复
要揭帖了,虽然没有解决,不过使用相对于过滤前的数据,这张表已经低于2000笔数据,使用client程序的字串compare已经可以处理了,谢谢各位了,分不多,平分吧
claro 2009-07-17
  • 打赏
  • 举报
回复
群星颤动
feixianxxx 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 aled6825 的回复:]
楼上的结果全部不行
这是一张查询表阿,不是数据表.哪有用delete的
[/Quote]


IF OBJECT_ID('[tb]') IS NOT NULL 
DROP TABLE [tb]
go
CREATE TABLE [tb] (name VARCHAR(5),Item VARCHAR(4),value NUMERIC(4,2),tag INT)
INSERT INTO [tb]
SELECT 'John','ITCH',89.33,1 UNION ALL
SELECT 'John','ITCH',33.22,2 UNION ALL
SELECT 'Alex','ITCH',67.77,3 UNION ALL
SELECT 'Jacky','ITCH',89.01,1 UNION ALL
SELECT 'Alex','YHTC',34.22,2 UNION ALL
SELECT 'Bruce','YHTC',35.11,2 UNION ALL
SELECT 'Bruce','YHTC',89.11,3
go
select *
from tb a
where tag =(select min(tag) from tb where name=a.name and Item = a.Item )

name Item value tag
----- ---- --------------------------------------- -----------
Alex ITCH 67.77 3
Alex YHTC 34.22 2
Bruce YHTC 35.11 2
Jacky ITCH 89.01 1
John ITCH 89.33 1

(5 行受影响)
gzzwind 2009-07-16
  • 打赏
  • 举报
回复
好像见过好多类似这样的问题哦,用分析函数试试吧

select name,Item,value,tag
from (select name,Item,value,tag,count(*) over (PARTITION BY name,Item,)as cou
from 表名) t
where t.cou=1
;
ChinaJiaBing 2009-07-16
  • 打赏
  • 举报
回复

打开包含重复记录的数据库。
在“数据库”窗口中的“对象”下,单击“查询”,然后单击“数据库”窗口工具栏上的“新建”。
在“新建查询”对话框中,单击“查找重复项查询向导”,然后单击“确定”。
这可能是因为 Access 正运行于沙盒模式,但您的计算机上尚未安装 Microsoft Jet 4.0 SP8 或更高版本。启用沙盒模式后,必须安装有 Jet 4.0 SP8 或更高版本,Access 才能完全发挥作用。

有关安装 Jet 升级的详细信息,请参阅 Office Online 文章关于 Microsoft Jet 4.0 SP8 或更高版本。

有关沙盒模式的详细信息,请参阅 Office Online 文章关于 Microsoft Jet Expression Service 沙盒模式。

在该向导中的表列表中,选择包含重复记录的表,然后单击“下一步”。
从可用字段列表中,选择包含重复信息的字段,例如,如果您想比较以不同方式书写的街道地址以查找重复记录,请选择“城市”字段。然后单击“下一步”。
从可用字段列表中,针对要在重复记录中检查的数据选择字段,例如“地址”字段。然后单击“下一步”。
输入查询的名称,例如“针对客户查找重复项”,然后单击“完成”以运行查询。
运行查询时,包含重复字段的记录(在本例中,就是同一城市的所有记录)按照该重复字段(“城市”)排序,这样就可以比较要检查的任何其他字段(例如“地址”)中的数据。在本例中,重复记录的“地址”字段包含不同的数据(例如 "崇外大街" 和 "崇德门外大街")。



如果您的数据库只包含少量的重复记录,可以选择不需要的个别记录并将其删除。当您删除“地址”字段中不使用缩写的重复记录之后,记录将按如下方式显示。



但是,您不能为了删除重复记录而将“查找重复项”查询转换为删除查询。这是由于“查找重复项”查询返回的是原始记录和该记录的所有副本,方便您选择要删除的版本。因此,如果将“查找重复项”查询转换为删除查询,将会同时删除原始记录和重复记录。但是,如果您不需要选择待删除的版本,则有一种既可以保留原始记录、又能自动删除重复记录的方法。

自动删除重复记录并保留原始记录
从表中删除重复记录需要两个步骤。第一步,复制包含重复记录的表的结构,生成包含重复记录的所有字段的主键。第二步,创建并运行从原始表到新表的追加查询。由于主键字段不能包含重复记录,因此这一过程将生成不含重复记录的表。

复制该表并使包含重复项的字段成为主键
在“数据库”窗口中选择该表。
单击工具栏上的“复制”。
然后单击工具栏上的“粘贴”。
在“粘贴表方式”对话框中,键入已复制的表的名称,单击“只粘贴结构”,然后单击“确定”。
在“设计”视图中打开新表,选择复制表中包含重复记录的字段。
单击工具栏上的“主键”以基于选定字段创建主键。
保存并关闭该表。
仅将唯一的记录追加到新表
基于包含重复记录的原始表创建一个新查询。
在“查询设计”视图中,单击工具栏上的“查询类型”,然后单击“追加查询”。
在“追加”对话框中,在“表名称”列表中单击新表的名称,然后单击“确定”。
添加来自原始表的所有字段,方法是将星号 (*) 拖动到查询设计网格中。
单击工具栏上的“运行”。
当您收到将要追加行的消息时,请单击“是”。
当您收到 Microsoft Access 无法在追加查询中追加所有记录时,请单击“是”。这样,只会将不重复的记录传输到新表中,放弃重复记录。

linguojin11 2009-07-16
  • 打赏
  • 举报
回复
一、SQL SERVER 和ACCESS的数据导入导出
常规的数据导入导出:
使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:
○1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation
○2Services(数据转换服务),然后选择 czdImport Data(导入数据)。
○3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。
○4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。
○5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。
○6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

Transact-SQL语句进行导入导出:
1.在SQL SERVER里查询access数据: 免费网页模版下载http://www.it55.com

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\DB.mdb";User ID=Admin;Password=')...表名 45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

2.将access导入SQL server
在SQL SERVER 里运行:
SELECT *
INTO newtable
FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\DB.mdb";User ID=Admin;Password=' )...表名 it55.com

3.将SQL SERVER表里的数据插入到Access表中
在SQL SERVER 里运行:
insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source=" c:\DB.mdb";User ID=Admin;Password=')...表名
(列名1,列名2)
select 列名1,列名2 from sql表 精美韩国模版下载http://www.it55.com

实例:
insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\db.mdb';'admin';'', Test)
select id,name from Test
INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:\trade.mdb'; 'admin'; '', 表名)
SELECT *
FROM sqltablename
http://www.it55.com/
aled6825 2009-07-16
  • 打赏
  • 举报
回复
真的不行的话就只有使用编程字串比较来实现了
aled6825 2009-07-16
  • 打赏
  • 举报
回复
各位有试过在access中执行吗?
HailRangar 2009-07-15
  • 打赏
  • 举报
回复
name Item value tag
John ITCH 89.33 1


select name,Item,value,min(tag) from people group by name,Item,value 试试吧
lihan6415151528 2009-07-15
  • 打赏
  • 举报
回复

delete a
from ta a
where exists(select 1 from ta where name=a.name amd Item = a.Item and flag <a.flag)
guguda2008 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL code--功能概述:删除重复记录
在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*from peoplewhere peopleIdin (select peopleIdfrom peoplegroupby peopleIdhavingcount(peopleId)>1)2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录deletefrom peoplewhere peopleIdin (select peopleIdfrom peoplegroupby peopleIdhavingcount(peopleId)>1)and rowidnotin (selectmin(rowid)from peoplegroupby peopleIdhavingcount(peopleId )>1)3、查找表中多余的重复记录(多个字段)select*from vitae awhere (a.peopleId,a.seq)in (select peopleId,seqfrom vitaegroupby peopleId,seqhavingcount(*)>1)4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录deletefrom vitae awhere (a.peopleId,a.seq)in (select peopleId,seqfrom vitaegroupby peopleId,seqhavingcount(*)>1)and rowidnotin (selectmin(rowid)from vitaegroupby peopleId,seqhavingcount(*)>1)5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录select*from vitae awhere (a.peopleId,a.seq)in (select peopleId,seqfrom vitaegroupby peopleId,seqhavingcount(*)>1)and rowidnotin (selectmin(rowid)from vitaegroupby peopleId,seqhavingcount(*)>1)

比方说在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;Select Name,Count(*)From AGroupBy NameHavingCount(*)>1

如果还查性别也相同大则如下:Select Name,sex,Count(*)From AGroupBy Name,sexHavingCount(*)>1
[/Quote]
学习了,谢谢分享
zhxingway 2009-07-15
  • 打赏
  • 举报
回复
全是高手啊,都没有解决?汗

帮顶顶
aled6825 2009-07-15
  • 打赏
  • 举报
回复
楼上的结果全部不行
这是一张查询表阿,不是数据表.哪有用delete的
  • 打赏
  • 举报
回复
---------------------------------
-- Author: HEROWANG(让你望见影子的墙)
-- Date : 2009-07-15 07:06:42
---------------------------------

IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
go
CREATE TABLE [tb] (name VARCHAR(5),Item VARCHAR(4),value NUMERIC(4,2),tag INT)
INSERT INTO [tb]
SELECT 'John','ITCH',89.33,1 UNION ALL
SELECT 'John','ITCH',33.22,2 UNION ALL
SELECT 'Alex','ITCH',67.77,3 UNION ALL
SELECT 'Jacky','ITCH',89.01,1 UNION ALL
SELECT 'Alex','YHTC',34.22,2 UNION ALL
SELECT 'Bruce','YHTC',35.11,2 UNION ALL
SELECT 'Bruce','YHTC',89.11,3



delete t
from tb t where exists(select 1 from tb where name=t.name and item=t.item and tag<t.tag)

select * from tb

name Item value tag
John ITCH 89.33 1
Alex ITCH 67.77 3
Jacky ITCH 89.01 1
Alex YHTC 34.22 2
Bruce YHTC 35.11 2
feixianxxx 2009-07-14
  • 打赏
  • 举报
回复
delete a 
from ta a
where tag <> (select min(tag) from ta where name=a.name amd Item = a.Item )
feixianxxx 2009-07-14
  • 打赏
  • 举报
回复
delete a 
from ta a
where tag in (select min(tag) from ta where name=a.name amd Item = a.Item )
feixianxxx 2009-07-14
  • 打赏
  • 举报
回复
select * from tb t 
where not exists(select * from tb where t.name=name and t.item=item and tag<t.tag )
-狙击手- 2009-07-14
  • 打赏
  • 举报
回复
delete a
from ta a
where exists(select 1 from ta where name=a.name amd Item = a.Item and flag <a.flag)
--小F-- 2009-07-14
  • 打赏
  • 举报
回复
--功能概述:删除重复记录

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

比方说在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧