SQL 按照两个字段去除列重复的数据,保留一行。

首先创建一个例子要用的表

  CREATE TABLE [dbo].[as1]
(
[id] [nchar] (10) COLLATE Chinese_PRC_CI_AS NULL,
[a] [nchar] (10) COLLATE Chinese_PRC_CI_AS NULL,
[b] [nchar] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

GO

插入例子要用的数据

INSERT INTO dbo.as1
        ( id, a, b )
VALUES  ( N'1', -- id - nchar(10)
          N'2', -- a - nchar(10)
          N'3'  -- b - nchar(10)
          ),
   ( N'2', -- id - nchar(10)
          N'2', -- a - nchar(10)
          N'2'  -- b - nchar(10)
          ),
  ( N'3', -- id - nchar(10)
          N'2', -- a - nchar(10)
          N'1'  -- b - nchar(10)
          ),
  ( N'4', -- id - nchar(10)
          N'2', -- a - nchar(10)
          N'2'  -- b - nchar(10)
          ),
  ( N'5', -- id - nchar(10)
          N'1', -- a - nchar(10)
          N'2'  -- b - nchar(10)
          )



-----------分割线---------

 SELECT *  FROM dbo.as1


--简单查看全部数据


   SELECT a.a,a.b FROM dbo.as1 AS a  JOIN dbo.as1 AS T ON T.id = a.id WHERE a.a= T.a AND a.b= T.b 

 GROUP BY a.a, a.b  HAVING COUNT(*) > 1


 --查询出重复的数据



 SELECT id FROM dbo.as1 T
WHERE EXISTS 
(
SELECT 1 FROM dbo.as1 WHERE a= T.a AND b= T.b 
 GROUP BY a, b  HAVING COUNT(*) > 1

 )


 --查询出重复数据对应的ID号



 SELECT min(id)AS 最小的ID FROM dbo.as1 GROUP BY a, b HAVING COUNT(*) > 1


 --查询出数据里重复ID的最小值(准备保留大的ID)


--下面是要删除的语句的查询


SELECT *  FROM dbo.as1
WHERE id IN


(
SELECT id FROM dbo.as1 T


WHERE EXISTS 
(
SELECT 1 FROM dbo.as1 WHERE a= T.a AND b= T.b 
 GROUP BY a, b  HAVING COUNT(*) > 1
 )
 
 
AND
 T.id NOT IN
 (
 SELECT min(id) FROM dbo.as1 GROUP BY a, b HAVING COUNT(*) > 1
 )

 )


--删除语句


DELETE FROM   dbo.as1
WHERE id IN


(
SELECT id FROM dbo.as1 T


WHERE EXISTS 
(
SELECT 1 FROM dbo.as1 WHERE a= T.a AND b= T.b 
 GROUP BY a, b  HAVING COUNT(*) > 1
 )
 
 
AND
 T.id NOT IN
 (
 SELECT min(id) FROM dbo.as1 GROUP BY a, b HAVING COUNT(*) > 1
 )

 )


--------------

DELETE FROM  表名
WHERE ID号 IN


(
SELECT  ID号 FROM 表名 T


WHERE EXISTS 
(
SELECT 1 FROM 表名 WHERE 字段1= T.字段1 AND 字段2= T.字段2 
 GROUP BY 字段1, 字段2  HAVING COUNT(*) > 1
 )
 
 
AND
 T. ID号 NOT IN
 (
 SELECT min( ID号) FROM 表名GROUP BY 字段1, 字段2 HAVING COUNT(*) > 1
 )
 )

  
  • 2
    点赞
  • 11
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论 1

打赏作者

ruo40018293

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值