如何删除重复记录

时间:2016-06-26 11:26:13

标签: sql oracle

查询:

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有一个2个关系。有可能对于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视图的一部分。

提前致谢。

1 个答案:

答案 0 :(得分: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,添加所有列,指定一个' unique'行。