根据其中二个字段判断重复,只保留一条记录. 求一个删除的SQL 语句谢谢!!

时间:2021-03-04 14:47:08
根据其中二个字段判断重复,只保留一条记录,其他删除,
比如(判断字段1和字段2)
字段1 字段2 字段3 字段4
a     b     3      1
a     b     x      1

a     c     3      2
a     b     d      3

b     c     d      2

想得到的结果为
a     b     3      1(或者2 或者 4)
a     c     3      2
b     c     d      2

4 个解决方案

#1


加入辅助列ID,自增字段
TRY
SELECT * FROM TT A WHERE ID=
(SELECT TOP 1 ID FROM TT WHERE 字段1 & 字段2=A.字段1 & A.字段2  )

#2


增加唯一ID字段处理最简单,如楼上所述。

#3



    判断重复,只保留一条记录,但是要显示全部字段《查询》
    http://access911.net/index.asp?u1=a&u2=79FABE1E14DC







 --911--

#4


判断重复,只保留一条记录,但是要显示全部字段
 

作者:cg1  摘自:access911.net  编辑:cg1  更新日期:2003-12-9  浏览人次:2184
 
专题地址:
http://access911.net/?kbid;79FABE1E14DC
 
 

简述:
判断重复,只保留一条记录,但是要显示全部字段《查询》

 

阅读前需掌握:
熟练掌握 JET SQL 查询
 

难度等级:
80 
 



 



 



 



 


 

 
 
 

问题:



 根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!!

比如
字段1 字段2 字段3 字段4
a     b     c      1
a     b     c      1

a     b     d      2
a     b     d      3

b     b     d      2

想得到的结果为
a     b     c      1
a     b     d      2(或者3)
b     b     d      2
说明,根据字段1,2,3组合不重复,字段4 不考虑,得到了3个记录
但是也要显示字段4。
 

 



方法一:



 
可以用临时表的方法来解决:
CurrentProject.Connection.Execute "drop table temptable"
CurrentProject.Connection.Execute "select * into temptable from 表2 where 1=2"
CurrentProject.Connection.Execute "insert into temptable(字段1,字段2,字段3) SELECT DISTINCT 表2.字段1, 表2.字段2, 表2.字段3 FROM 表2;"
CurrentProject.Connection.Execute "UPDATE temptable INNER JOIN 表2 ON (表2.字段1 = temptable.字段1) AND (表2.字段2 = temptable.字段2) AND (表2.字段3 = temptable.字段3) SET temptable.字段4 = [表2].[字段4];" 

 

 



方法二:



 
可以直接使用一个SELECT查询筛选出需要的数据:
可以假定第四字段都选值最小的
SELECT [1],[2], [3], Min([4]) AS Min4
FROM 表1
GROUP BY 表1.[1], 表1.[2], 表1.[3]; 

 

 



问题:



 表2

id  NAME  r1   r2
1   1     w    ee
1   1     1    1232
1   2     123  123
1   2     12   434
1   2     123  123
2   1     123  123

ID 为数值,NAME 为字符。每条记录没有唯一标识。
要求取得 ID 和 NAME 合并后不重复的记录,如有重复保留其中一条即可,但要显示所有记录。
 

 


回答:



 SELECT a.*, (select top 1 r1 from 表2 as a1 where a1.id=a.id and a1.name=a.name) AS r1, (select top 1 r2 from 表2 as a2 where a2.id=a.id and a2.name=a.name) AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a; 



SELECT a.*, dlookup("r1","表2","id=" & a.id  & " and name='"& a.name & "'") AS r1, dlookup("r2","表2","id=" & a.id  & " and name='"& a.name & "'") AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a; 



注意,上述代码中由于没有唯一标识列,因此显示的 R1 R2 的先后次序无从确定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请网友注意。

请注意,上述表2为没有唯一标识字段,如果现在再建立一个自动编号字段“主键”则可以用以下代码

SELECT a.ID, a.name, b.r1, b.r2, b.主键
FROM (SELECT 表2.id, 表2.NAME, Min(表2.主键) AS 主键
FROM 表2
GROUP BY 表2.id, 表2.NAME) AS a inner JOIN 表2 AS b ON a.主键=b.主键; 


 

 





access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接


 
 

#1


加入辅助列ID,自增字段
TRY
SELECT * FROM TT A WHERE ID=
(SELECT TOP 1 ID FROM TT WHERE 字段1 & 字段2=A.字段1 & A.字段2  )

#2


增加唯一ID字段处理最简单,如楼上所述。

#3



    判断重复,只保留一条记录,但是要显示全部字段《查询》
    http://access911.net/index.asp?u1=a&u2=79FABE1E14DC







 --911--

#4


判断重复,只保留一条记录,但是要显示全部字段
 

作者:cg1  摘自:access911.net  编辑:cg1  更新日期:2003-12-9  浏览人次:2184
 
专题地址:
http://access911.net/?kbid;79FABE1E14DC
 
 

简述:
判断重复,只保留一条记录,但是要显示全部字段《查询》

 

阅读前需掌握:
熟练掌握 JET SQL 查询
 

难度等级:
80 
 



 



 



 



 


 

 
 
 

问题:



 根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!!

比如
字段1 字段2 字段3 字段4
a     b     c      1
a     b     c      1

a     b     d      2
a     b     d      3

b     b     d      2

想得到的结果为
a     b     c      1
a     b     d      2(或者3)
b     b     d      2
说明,根据字段1,2,3组合不重复,字段4 不考虑,得到了3个记录
但是也要显示字段4。
 

 



方法一:



 
可以用临时表的方法来解决:
CurrentProject.Connection.Execute "drop table temptable"
CurrentProject.Connection.Execute "select * into temptable from 表2 where 1=2"
CurrentProject.Connection.Execute "insert into temptable(字段1,字段2,字段3) SELECT DISTINCT 表2.字段1, 表2.字段2, 表2.字段3 FROM 表2;"
CurrentProject.Connection.Execute "UPDATE temptable INNER JOIN 表2 ON (表2.字段1 = temptable.字段1) AND (表2.字段2 = temptable.字段2) AND (表2.字段3 = temptable.字段3) SET temptable.字段4 = [表2].[字段4];" 

 

 



方法二:



 
可以直接使用一个SELECT查询筛选出需要的数据:
可以假定第四字段都选值最小的
SELECT [1],[2], [3], Min([4]) AS Min4
FROM 表1
GROUP BY 表1.[1], 表1.[2], 表1.[3]; 

 

 



问题:



 表2

id  NAME  r1   r2
1   1     w    ee
1   1     1    1232
1   2     123  123
1   2     12   434
1   2     123  123
2   1     123  123

ID 为数值,NAME 为字符。每条记录没有唯一标识。
要求取得 ID 和 NAME 合并后不重复的记录,如有重复保留其中一条即可,但要显示所有记录。
 

 


回答:



 SELECT a.*, (select top 1 r1 from 表2 as a1 where a1.id=a.id and a1.name=a.name) AS r1, (select top 1 r2 from 表2 as a2 where a2.id=a.id and a2.name=a.name) AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a; 



SELECT a.*, dlookup("r1","表2","id=" & a.id  & " and name='"& a.name & "'") AS r1, dlookup("r2","表2","id=" & a.id  & " and name='"& a.name & "'") AS r2
FROM [SELECT DISTINCT 表2.id, 表2.NAME
FROM 表2]. AS a; 



注意,上述代码中由于没有唯一标识列,因此显示的 R1 R2 的先后次序无从确定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请网友注意。

请注意,上述表2为没有唯一标识字段,如果现在再建立一个自动编号字段“主键”则可以用以下代码

SELECT a.ID, a.name, b.r1, b.r2, b.主键
FROM (SELECT 表2.id, 表2.NAME, Min(表2.主键) AS 主键
FROM 表2
GROUP BY 表2.id, 表2.NAME) AS a inner JOIN 表2 AS b ON a.主键=b.主键; 


 

 





access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接