【问题标题】:view all data for duplicate rows in oracle在 oracle 中查看重复行的所有数据
【发布时间】:2012-02-01 20:35:44
【问题描述】:

我有一个有 6 列的表格:

  • id
  • name
  • type_id
  • code
  • lat
  • long

前三个是必需的。 ID 是私钥,按顺序自动插入。

我有一些重复的行,正如nametype_id 所定义的那样,但我想查看被骗者的所有数据。我可以很简单地找到骗子:

SELECT   name 
       , type_id
FROM   table1
GROUP BY name 
         , type_id
HAVING COUNT(*) > 1

但实际上查看所有信息让我感到困惑。我知道这应该很简单,但我在这里碰壁了。

【问题讨论】:

    标签: oracle select duplicates


    【解决方案1】:

    您始终可以在 IN 子句中使用 GROUP BY/ HAVING 查询。这可行且相对简单,但如果重复行的数量相对较大,则可能不是特别有效。

    SELECT *
      FROM table1
     WHERE (name, type_id) IN (SELECT name, type_id
                                 FROM table1
                                GROUP BY name, type_id
                               HAVING COUNT(*) > 1)
    

    使用分析函数通常会更有效,以避免再次撞到桌子。

    SELECT *
      FROM (SELECT id, 
                   name,
                   type_id,
                   code,
                   lat,
                   long,
                   count(*) over (partition by name, type_id) cnt
              FROM table1)
     WHERE cnt > 1
    

    根据您计划对数据执行的操作以及特定行可能有多少重复项,您可能还希望将 table1 加入到自身中以获取单行中的数据

    SELECT a.name,
           a.type_id,
           a.id,
           b.id,
           a.code,
           b.code,
           a.lat,
           b.lat,
           a.long,
           b.long
      FROM table1 a
           JOIN table1 b ON (a.name = b.name AND
                             a.type_id = b.type_id AND
                             a.rowid > b.rowid)
    

    【讨论】:

    • 我的第一个想法是第一个查询,但我不知道您是否可以在 IN 子句中使用两列。我想我应该尝试一下。谢谢。
    【解决方案2】:
    SELECT * 
    FROM   table1 t1 
    WHERE  (t1.name,t1.type_id) in ( SELECT DISTINCT name
                                                   , type_id
                                     FROM     table1
                                     GROUP BY name, type_id
                                     HAVING COUNT(*) > 1 )
    

    会做的。

    HTH

    【讨论】:

      【解决方案3】:

      您可以在表上进行自联接以查找所有重复项对:

      SELECT 
        a.name    name
      , a.type_id type_id_a
      , a.code    code_a
      , a.lat     lat_a
      , a.long    long_a
      , b.code    code_b
      , b.lat     lat_b
      , b.long    long_b
      FROM table1 a
      JOIN table1 b
      ON  a.name    = b.name
      AND a.type_id = b.type_id
      AND a.ROWID > b.ROWID
      

      为了确保一行不匹配自身并且每对只输出一次,我添加了a.ROWID > b.ROWID,它适用于 Oracle。如果您使用不同的数据库,您将需要不同的方式将它们分开。

      【讨论】:

      • 大概,您需要一个额外的连接条件来确保从AB 返回的行实际上是不同的行。类似AND a.id > b.idAND a.rowid > b.rowid
      【解决方案4】:

      如果比较字段之一具有 NULL 值,则仍然找不到双精度值。 为了得到这些,我使用 nvl 将比较字段中的 NULL 替换为我知道该表/字段中不会出现的值。

      【讨论】:

        【解决方案5】:

        只需将 NULLS 设为 0...

        ...使用 NVL 功能。

        【讨论】:

          猜你喜欢
          • 2017-07-16
          • 1970-01-01
          • 2015-04-30
          • 2012-11-07
          • 2011-12-07
          • 1970-01-01
          • 2020-11-12
          • 1970-01-01
          • 2012-10-06
          相关资源
          最近更新 更多