0

所以我们在我们的服务器上运行了一个重复的 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 中的每个条目都有重复项,所以......不必担心检查重复项。

4

1 回答 1

0

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

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

于 2012-10-26T18:10:23.233 回答