当前位置: 首页 > 面试题库 >

在SQL中使用rownum删除重复记录

万博涛
2023-03-14
问题内容

请帮助我了解基于rownum的删除记录,即使id重复,也不会发生,但是如果是这样的话。

select rownum,a.* from a;

    ROWNUM         ID NAME
---------- ---------- ----------
         1          1 leo_1
         2          2 leo_2
         3          3 leo_3
         4          1 leo_1
         5          2 leo_2
         6          3 leo_3

查询已尝试,但删除所有6行。

DELETE FROM a
WHERE rownum not in
(SELECT MIN(rownum)
FROM a
GROUP BY name);

但是此查询给出正确的结果:

SELECT MIN(rownum)
FROM a
GROUP BY name

    ROWNUM
----------
         1
         2
         3

预期结果 :

    ROWNUM         ID NAME
---------- ---------- ----------
         4          1 leo_1
         5          2 leo_2
         6          3 leo_3

问题答案:

使用 rowid

DELETE FROM table_name a
 WHERE EXISTS( SELECT 1
                 FROM table_name b
                WHERE a.id = b.id
                  AND a.name = b.name
                  AND a.rowid > b.rowid )

当然,您也可以这样做a.rowid < b.rowid。该rowid所以你是否删除具有较大的行或较小的地址不要紧只是该行的物理地址。

但是,您的预期结果没有任何意义。

Expected Result :

        ROWNUM         ID NAME
    ---------- ---------- ----------
             4          1 leo_1
             5          2 leo_2
             6          3 leo_3

rownum结果集的总是在查询时分配。这意味着rownum在不同的查询中(或同一查询多次运行时)特定的行可能会以不同的值出现。
rownum始终是顺序的,因此rownum在同一结果集中没有rownum1、2和3的值的情况下,结果集中永远不会有a的4
。无论您删除哪个重复行,您的结果都将是

预期结果 :

    ROWNUM         ID NAME
---------- ---------- ----------
         1          1 leo_1
         2          2 leo_2
         3          3 leo_3

但是这些rownum值是任意的。Oraclehtml" target="_blank">返回同样有效

预期结果 :

    ROWNUM         ID NAME
---------- ---------- ----------
         1          2 leo_2
         2          3 leo_3
         3          1 leo_1


 类似资料:
  • 问题内容: 我有一个sql server数据库,我已经预加载了大量的数据行。 不幸的是,数据库中没有主键,并且表中现在有重复的信息。我不担心没有主键,但是我担心数据库中存在重复项… 有什么想法吗?(原谅我成为sql server newb) 问题答案: 好吧,这就是为什么您应该在表上拥有主键的原因之一。什么版本的SQL Server?对于SQL Server 2005及更高版本: 然后,您不必在明

  • 本文向大家介绍sql 删除表中的重复记录,包括了sql 删除表中的重复记录的使用技巧和注意事项,需要的朋友参考一下 遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢 如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) 然后就可以直接删除,基本原理就是,找到重复记录的每一条记录,排除掉重复id最小的记录,删除剩余的重复

  • 这是我的原始表格: 预期表: 我无法向表中添加新列。

  • 问题内容: 请使用以下tsql查询: 我知道它在做什么,但是逻辑的最后一部分(对于每个重复集,在– insert一行之后)没有意义。在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么? 该查询发现这里 谢谢 问题答案: 在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么? 首先,它删除曾经有重复的所有行。也就是说,所有行,并且原始也。在上

  • 问题内容: 如何从以以下方式设置的表中删除重复项? 一个工作人员可以有多个与他们相关联的type_ID,我想删除所有重复的类型。如果有重复项,我想删除具有最新条目的类型。 问题答案: 窗口函数row_number()的教科书候选: 这也照顾了一组相同的受骗者的情况。 请参阅有关data.SE的简化演示。 更新较简单的版本 事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除:

  • 问题内容: 我有一个表,该表由id(key),符号,方向,范围,价格,百分比列组成。我想删除符号,方向,价格和百分比相同且范围最小的数据。我将如何完成? 我一直在尝试改变这种说法:使某些东西起作用。 问题答案: 这是 aw 表的样本数据。根据您的描述,我认为您想丢弃值分别为2、3和5的行。 确定的每个组合的最小范围值,,,和。 qryMinRanges : …给出以下结果集: 确定这些最小范围中的