SQL在一列x AND列y!= z中选择WHERE副本

时间:2012-10-26 17:35:10

标签: sql duplicate-removal

所以我们在服务器上运行了一个重复的SQL脚本,直到最近才意识到这一点。基本上我有很多行,其中有2个条目具有相同的列x(crn)。

最初输入的是同一列y(状态)。我们的应用程序让用户更新列y(状态)。但是现在我们有2行一个状态为'S',另一个状态为'S'以外的状态。我的目标:

删除表中的所有内容WHERE存在重复的CRN且STATUS为S.我不想删除行,除非有重复,但如果存在,我只想删除状态为'S'。另外,如果两个记录的状态都是S,我宁愿不删除这两个记录,但是如果我这样做,那就没那么大了,因为我会在下次下载时再次获得这些课程。

我已经开始创建一个select语句来查询我想要的行,但是不知道如何执行ONLY SELECT IF DUPLICATE EXISTS部分。我觉得我需要UNION或LEFT JOIN或者只有在存在重复时才能获取记录。

SELECT * FROM 
cas_usuECourses 
WHERE 
crn IN (SELECT crn FROM cas_usuECourses GROUP BY crn having count(1) > 1)
AND status = 'S'
AND termCode = 201320
编辑:有没有办法说......以上,但如果两个副本都有'S'只删除其中一个?

编辑:我“认为”这对我来说很好看。有什么想法吗?

SELECT id FROM (
    SELECT id, Row_Number() Over (Partition By crn ORDER BY id DESC) as ranking
    FROM cas_usuECourses
    WHERE status = 'S'
    AND termCode = 201320
) as ranking

WHERE rank = 1

我认为这会给我所有状态为'S'的ID,如果有两个'S',这将给我第二个创建的那个。我发现termCode中的每个条目都有重复,所以...不需要担心检查重复项。

1 个答案:

答案 0 :(得分:0)

如果您可以向表中添加一列并使用不同的值填充它,那么这将是微不足道的 - 您可以定位每一行。

否则,在你的初始步骤之后,我通常会在你的subselect上打开一个状态为S的光标,只选择两个状态为'S'的crn,并在每个循环迭代中删除带有适当crn的top 1记录。这样你就可以摆脱重复的crn / status对。