日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

數(shù)據(jù)庫(kù)中表存在重復(fù)數(shù)據(jù),需要清理重復(fù)數(shù)據(jù),清理后保留其中一條的情況是比較常見(jiàn)的需求,如何通過(guò)1條SQL準(zhǔn)確的刪除數(shù)據(jù)呢?

1. 創(chuàng)建表及測(cè)試數(shù)據(jù)

1.1 數(shù)據(jù)庫(kù)中創(chuàng)建一張測(cè)試表

CREATE TABLE `test` (
  `id` INT  NOT NULL AUTO_INCREMENT,
  `c1` VARCHAR(20) DEFAULT NULL,
  `c2` VARCHAR(20) DEFAULT NULL,
  `c3` INT  DEFAULT NULL,
  `c4` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB  DEFAULT CHARSET=utf8;

1.2 插入測(cè)試數(shù)據(jù)

INSERT INTO test(c1,c2,c3,c4) VALUES( 'a','b',10, '2022-05-24 18:00:46'),('a','c',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'a','c',10, '2022-05-24 18:00:46'),('a','b',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',10, '2022-05-24 18:00:46'),('d','b',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',20, '2022-05-24 18:00:46'),('d','b',30, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',20, '2022-05-24 18:00:46'),('a','b',40, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'd','b',40, '2022-05-24 18:00:46'),('r','f',40, '2022-05-24 18:00:46');

1.3 查看重復(fù)數(shù)據(jù)

例如c1,c2 這2個(gè)字段組合作為唯一條件,則查詢(xún)重復(fù)數(shù)據(jù)的SQL如下

SELECT
  c1,
  c2,
  COUNT(*)
FROM
  test
GROUP BY c1,
  c2
HAVING COUNT(*) > 1;

可見(jiàn),結(jié)果如下:

2. 如何刪除重復(fù)數(shù)據(jù)

2.1 方案一

很多研發(fā)同學(xué)習(xí)慣的思路如下:

  • 先查出重復(fù)的記錄(使用in)
  • 再查出在重復(fù)記錄但id不在每組id最大值的記錄
  • 直接將select 改為delete進(jìn)行刪除

查詢(xún)SQL如下

SELECT *    FROM  test  
WHERE (c1,c2) IN (
SELECT c1,c2  
FROM test 
GROUP BY c1,c2 
HAVING COUNT(*)>1 )
AND  id NOT  IN (
SELECT MAX(id) 
FROM  test 
GROUP BY c1,c2 
HAVING COUNT(*)>1)
 ORDER BY c1,c2
;

看上去比較符合結(jié)果了,但是改為delete執(zhí)行的時(shí)候結(jié)果如下:

--  delete SQL
DELETE FROM  test  
WHERE (c1,c2) IN (
SELECT c1,c2  
FROM test 
GROUP BY c1,c2 
HAVING COUNT(*)>1 )
AND  id NOT  IN (
SELECT MAX(id) 
FROM  test 
GROUP BY c1,c2 
HAVING COUNT(*)>1)

出現(xiàn)報(bào)錯(cuò)信息:

錯(cuò)誤代碼:1093
You can't specify target table 'test' for update in FROM clause

也就是說(shuō)MySQL里需刪除的目標(biāo)表在in子查詢(xún)中時(shí),不能直接執(zhí)行刪除操作。

3. 推薦寫(xiě)法

基于以上情況,使用單條SQL刪除的方式如下:

查詢(xún)SQL:

SELECT  a.*  
FROM  test  a ,
(SELECT  c1,c2,MAX(id)id FROM test  GROUP BY c1,c2 HAVING COUNT(*)>1)b
WHERE    a.c1=b.c1 AND a.c2=b.c2
AND a.id <>b.id

刪除SQL

DELETE  a 
FROM  test  a ,
(SELECT  c1,c2,MAX(id)id FROM test  GROUP BY c1,c2 HAVING COUNT(*)>1)b
WHERE    a.c1=b.c1 AND a.c2=b.c2
AND a.id <>b.id

結(jié)果:

<n>查詢(xún):delete a FROM test a , (select c1,c2,max(id)id from test group by c1,c2 having count(*)>1)b where a.c1=b.c1 and a.c2=b.c2 and a....


共 7 行受到影響

刪除后數(shù)據(jù)如下:

無(wú)重復(fù)數(shù)據(jù)了。

分享到:
標(biāo)簽:SQL
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定