SQLite -无此表:使用CTE删除重复记录时

lzfw57am  于 2023-06-23  发布在  SQLite
关注(0)|答案(2)|浏览(145)

我已经创建了一个联系人表(姓名,电话,电子邮件),我有一些重复的记录,我想删除

WITH ContactsCTE AS (
    SELECT *, row_number() OVER ( PARTITION BY Name ORDER BY Name) as RowNumber
    FROM Contacts
)
SELECT * FROM ContactsCTE

当我使用SELECT时,它会显示它们的数据和rowNumber,我想它工作得很好

| Name | Phone |     Email      | RowNumber |
| Kris | 0123  | kris@gmail.com |     1     |
| Kris | 0123  | kris@gmail.com |     2     |
| Kris | 0123  | kris@gmail.com |     3     |
| Annie| 065   | annie@gmail.com|     1     |
| Bob  | 0123  | bob@gmail.com  |     1     |
| Bob  | 0123  | bob@gmail.com  |     2     |

但是如果我想删除它们

WITH ContactsCTE AS (
        SELECT *, row_number() OVER ( PARTITION BY Name ORDER BY Name) as RowNumber
        FROM Contacts
    )
 DELETE FROM ContactsCTE WHERE RowNumber > 1

我收到这样的信息:* *"结果:无此表:ContactsCTE "**在第1行:

ssm49v7z

ssm49v7z1#

SQLite不支持可更新的CTE。
可以使用NOT EXISTS

DELETE FROM Contacts 
WHERE EXISTS (
  SELECT 1 FROM Contacts c  
  WHERE c.Name = Contacts.Name AND c.rowid < Contacts.rowid
);

这将删除存在另一行的所有行,该行具有相同的名称和较小的rowid
参见demo
或者使用相关子查询:

DELETE FROM Contacts 
WHERE rowid > (
  SELECT MIN(rowid) FROM Contacts c  
  WHERE c.Name = Contacts.Name
);

参见demo
结果如下:

| Name  | Phone | Email           |
| ----- | ----- | --------------- |
| Kris  | 123   | kris@gmail.com  |
| Annie | 65    | annie@gmail.com |
| Bob   | 123   | bob@gmail.com   |
pbossiut

pbossiut2#

我也有同样的问题。
一种解决方法如下。
不使用“DELETE FROM ContactsCTE WHERE RowNumber > 1”,而是使用SELECT * FROM ContactsCTE WHERE RowNumber = 1;

相关问题