SQL

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

发布于 2021-03-27 16:46:22

请帮助我了解基于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
关注者
0
被浏览
122
1 个回答
  • 面试哥
    面试哥 2021-03-27
    为面试而生,有面试问题,就找面试哥。

    使用 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值是任意的。Oracle返回同样有效

    预期结果 :

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看