所以我们在服务器上运行了一个重复的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中的每个条目都有重复,所以...不需要担心检查重复项。
答案 0 :(得分:0)
如果您可以向表中添加一列并使用不同的值填充它,那么这将是微不足道的 - 您可以定位每一行。
否则,在你的初始步骤之后,我通常会在你的subselect上打开一个状态为S的光标,只选择两个状态为'S'的crn,并在每个循环迭代中删除带有适当crn的top 1记录。这样你就可以摆脱重复的crn / status对。