【发布时间】:2012-10-27 03:21:42
【问题描述】:
所以我们在服务器上运行了一个重复的 SQL 脚本,直到最近才意识到这一点。基本上我有很多行,其中有 2 个条目具有相同的列 x (crn)。
最初也使用相同的 y 列(状态)输入。我们的应用程序让用户更新列 y(状态)。但是,现在我们有 2 行,其中一行的状态为“S”,另一行的状态不是“S”。我的目标:
删除表中的所有内容,其中有一个重复的 CRN,状态为 S。我不想删除行,除非有重复,但如果有,我只想删除状态为的行'S'。另外,如果两条记录的状态都是 S,我宁愿不删除这两条记录,但如果我这样做了,那也没什么大不了的,因为我会在下次下载时再次获取课程。
我已经开始制作一个选择语句来查询我想要的行,但不知道如何执行 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 中的每个条目都有重复项,所以...不必担心检查重复项。
【问题讨论】:
-
好吧,我一直在这里搜索有关重复项的信息,但没有看到任何我需要的信息。
-
这里的信息会让你走上正确的道路。
-
Turbot 什么是 RDBMS?兰迪,我不明白 1 和 * 返回相同数量的结果。以上给了我几乎很好的数据,我只想删除状态='S'而不是两者的行。
-
@Leeish 你用的是什么数据库? MySQL? SQL 服务器?甲骨文?
标签: sql duplicate-removal