【问题标题】:How do I remove duplicate records如何删除重复记录
【发布时间】:2016-06-26 11:26:13
【问题描述】:

查询:

Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name 
FROM table_c , table_s, table_m, table_o, table_a, table_con 
  WHERE 
   table_s.objid = table_c.sobjid
   AND table_m.cobjid (+) = table_c.objid 
   AND table_o.objid (+) = table_m.olobjid   
   AND table_a.objid (+) = table_o.aobjid 
   AND table_co.objid (+) = table_a.conobjid;

这里有 6 张桌子。 table_c 和 table_s 有一对一的关系。有可能对于 1 个 table_o 记录,我们可以有 2 个 table_c 记录或者可能没有记录。由于我需要在 SELECT 中获取 table_co 值以及 table_c 和 table_s 表,所以我在所有表 table_c->table_m- 上使用了左连接>table_o->table_a->table_co.

现在在运行这个查询时,它给了我重复的记录。我在 table_c 中有数百万条记录,所以如果我使用 distinct 或 Union ALL 删除重复记录,我的查询需要很长时间,这是不可接受的解决方案。

我能否以这样的方式更正此查询,以便它为我提供唯一记录而不会出现性能问题。

请注意,此查询是外部系统用来获取数据的 sql 视图的一部分。

提前致谢。

【问题讨论】:

  • 请使用显式连接语法重写您的查询。
  • 我同意 tim join 语法会使这更容易排除故障,因为您的关系不清楚。 w3schools.com/sql/sql_join_inner.asp 是一篇关于内连接的文章,以防万一这是一个较新的概念。我马上看到的一个问题是您没有为 table_s 与其他表定义任何关系,这意味着这将创建一个交叉连接并可能返回大量重复项,这可能也是为什么 distinct 或 group by 性能会很差的原因。
  • 嗨@Matt/@Tim,我也同意使用显式连接(内/左外连接)并重新编写查询的建议。另一点,我不认为 table_s 可能是重复记录的原因,因为它与 table_c 具有 one2one 关系,并且 table_c 是此查询中的前导表。谢谢-

标签: sql oracle


【解决方案1】:

尝试使用ROW_NUMBER()

SELECT * FROM (
    Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name ,
           ROW_NUMBER() OVER(PARTITION BY table_c.id_number,table_c.name ORDER BY 1) as rnk
    FROM table_c 
    INNER JOIN table_s ON(table_s.objid = table_c.sobjid)
    LEFT OUTER JOIN table_m ON(table_m.cobjid = table_c.objid )
    LEFT OUTER JOIN table_o ON(table_o.objid = table_m.olobjid)
    LEFT OUTER JOIN table_a ON(table_a.objid = table_o.aobjid )
    LEFT OUTER JOIN table_con ON(table_co.objid = table_a.conobjid))
WHERE rnk = 1;

注意:请避免使用隐式连接语法(逗号分隔)并使用正确的连接语法。

我使用 PARTITION BY table_c.id_number,table_c.name ,添加所有列指定一个“唯一”行。

【讨论】:

  • 旧的连接语法并没有错——它只是令人困惑。
  • 我可能选错词了,我不是这个意思。我想正确会更好@MT0
  • 嗨@Sagi,我尝试了您的解决方案,结果如下:1)如果我提供过滤条件,例如 table_c.id_number='12345' 那么它不会给我重复记录。 2)如果我不应用任何过滤器,那么查询在提供初始记录集时会花费太多时间。所以我相信我们仍然有性能问题。谢谢
  • 还有什么建议吗?
猜你喜欢
  • 2020-03-31
  • 1970-01-01
  • 2021-03-17
  • 2016-01-07
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多