代码中存在创建重复行的错误。这是我删除重复项之前看到的表中两列的示例。 (有一个标识列,ID
和其他不相关的列
SampleID ProjectID
0 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
0 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
0 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
0 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
0 00e95061-96e2-4db5-999e-5ca629561c50
0 00e95061-96e2-4db5-999e-5ca629561c50
0 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
我需要从表中删除重复项,以便我留下一个包含这些行的表,并最终完成此操作,但我的问题是为什么我最初尝试的查询没有按预期工作。
SampleID ProjectID
0 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
1 c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece
0 00e95061-96e2-4db5-999e-5ca629561c50
1 00e95061-96e2-4db5-999e-5ca629561c50
我尝试的查询是
DELETE FROM INS_Sample WHERE ID NOT IN
(SELECT MIN(ID) FROM INS_Sample GROUP BY SampleID, ProjectID);
我在this问题的答案中找到了它。当我运行此查询时,它似乎无限期地运行,所以我停止了它,并且查询实际上已经在我的表中插入更多重复的行。我必须先运行SELECT MIN(ID) FROM INS_Sample GROUP BY SampleID, ProjectID
,然后将生成的ID
的逗号分隔列表粘贴到我的原始查询中,以便它看起来像这样
DELETE FROM INS_Sample WHERE ID NOT IN
(1234, 5678, /*a lot more IDs*/);
在我得到我想要的结果之前。为什么我的第一个查询不应该正常工作,以及世界上的行如何插入到表中?除了选择以查看表格中的内容之外,我的查询编辑器中没有任何其他内容。
答案 0 :(得分:0)
您正在执行DELETE
语句,因此它会在您的表格中执行DELETE
但如果您说它INSERT
某些记录仍然存在,那么只有一种方式,那就是TRIGGER
。检查并查看您的AFTER DELETE
表中是否定义了触发器(具体为INS_Sample
触发器)。
答案 1 :(得分:0)
delete
查询无法在表中插入行。 。 。好吧,除非你在桌面上有一个触发器来实现这种行为。
如果没有ID匹配,您的查询可能会挂起并对表格不执行任何操作。您说id
是一个标识,但您没有指定它是否是主键。如果子查询中的id
曾 NULL
,那么NOT IN
永远不会评估为真。
我建议改用这样的东西:
DELETE
FROM INS_Sample s
WHERE s.id > (SELECT MIN(ID)
FROM INS_Sample s2
WHERE s2.SampleId = s.SampleID AND s2.ProjectID = s.ProjectID
);
答案 2 :(得分:0)
您可以尝试这样的查询
;with cte as (
select RowN = row_number() over (partition by sampleid, projectid order by sampleid, projectid) from yourproject
) delete from cte where RowN > 1