【问题标题】:SQL Select WHERE duplicate in one column x AND column y != zSQL 选择 WHERE 在一列 x 和列 y 中重复!= z
【发布时间】: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 中的每个条目都有重复项,所以...不必担心检查重复项。

【问题讨论】:

  • 搜索/尝试了什么?什么 RDMS?可能重复:hereherehere
  • 好吧,我一直在这里搜索有关重复项的信息,但没有看到任何我需要的信息。
  • 这里的信息会让你走上正确的道路。
  • Turbot 什么是 RDBMS?兰迪,我不明白 1 和 * 返回相同数量的结果。以上给了我几乎很好的数据,我只想删除状态='S'而不是两者的行。
  • @Leeish 你用的是什么数据库? MySQL? SQL 服务器?甲骨文?

标签: sql duplicate-removal


【解决方案1】:

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

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

【讨论】:

  • @Leeish - 游标效率低下,但有时需要(至少在 SQL Server 中)迭代数据库表记录的方式。请参阅示例here。使用光标你可以解决这个问题。如果您在生产服务器上运行代码,请不要忘记使用事务来测试您的代码!
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多