查询插入行而不是删除行

时间:2016-12-21 19:54:47

标签: sql sql-server tsql

代码中存在创建重复行的错误。这是我删除重复项之前看到的表中两列的示例。 (有一个标识列,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*/);

在我得到我想要的结果之前。为什么我的第一个查询不应该正常工作,以及世界上的行如何插入到表中?除了选择以查看表格中的内容之外,我的查询编辑器中没有任何其他内容。

3 个答案:

答案 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