如何从具有相同ID和名称的表中删除记录?

时间:2016-09-12 14:03:49

标签: sql sqlite duplicates

我有表AddClient

Id   cId  name amount
10L CL-J Jon   5000
10L CL-B Ben   4000
10L CL-J Jon   6000 
10L CL-B Ben   8000
10L CL-T Tony  9000
10L CL-J Jon   5000

当我尝试删除像这样的记录时

DELETE from AddClient where cId = 'CL-J' or name = 'Jon'

删除Jon的所有记录。我想删除一个Jon的记录。

3 个答案:

答案 0 :(得分:1)

一个明显的解决方案是使用AND而不是OR

DELETE FROM AddClient
    WHERE cId = 'CL-J' AND name = 'Jon';

这仍然会导致删除两条记录,因此它并不是您想要的。但逻辑似乎更清楚(对于局外人)。

如果您的SQLite启用了该功能,则可以使用:

DELETE FROM AddClient
    WHERE cId = 'CL-J' AND name = 'Jon'
    LIMIT 1;

(请阅读here,了解LIMIT的可选DELETE条款。)

另一种选择是使用rowid

DELETE FROM AddClient
    WHERE rowid = (SELECT MIN(rowid)
                   FROM AddClient
                   WHERE cId = 'CL-J' AND name = 'Jon'
                  );

答案 1 :(得分:0)

好吧,当你说"我只想删除Jon的一条记录。"您需要指定要删除的元组(行)的其他属性(列)。使用AND运算符的问题是 ALL 的名称属性为' John'也有' CL-J'的cId属性因此,实际上,您仍然删除与使用OR运算符时相同的行数。

我还发现,Id列与名称为' John'的所有记录完全相同,唯一的区分列是amount。因此,如果您真的只想删除约翰的一条记录,那么您只需 ONLY 选项:

DELETE 
FROM AddClient
WHERE name = 'John'
AND amount = 6000;

我希望这会对你有所帮助。干杯!

答案 2 :(得分:0)

如果您正在使用Mysql

DELETE FROM AddClient WHERE NAME='john' LIMIT 1;

或者您也可以根据每条记录的b / c金额不同删除单个记录.....

DELETE 
FROM AddClient
WHERE name = 'John'
AND amount = '5000';