所以我们在我们的服务器上运行了一个重复的 SQL 脚本,直到最近才意识到这一点。本质上,我有很多行,其中有 2 个条目具有相同的列 x (crn)。
最初也使用相同的 y 列(状态)输入。我们的应用程序让用户更新列 y(状态)。但是,现在我们有 2 行,其中一行的状态为“S”,另一行的状态不是“S”。我的目标:
从表中删除所有内容,其中存在重复的 CRN,状态为 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
编辑:有没有办法说...上面,但如果两个 dup 都有'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 排名 = 1
我认为这会给我所有状态为“S”的ID,如果有两个带有“S”的ID,这会给我第二个创建的ID。我发现我们的 termCode 中的每个条目都有重复项,所以......不必担心检查重复项。