2016-06-26 93 views
0

查询:如何删除重复记录

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_c和table_s表中使用table_co值,所以我在所有表中使用了省略join table_c-> table_m- > table_o-> table_a-> table_co。

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

我可以以这样的方式纠正这个查询,它给我独特的记录没有性能问题。

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

在此先感谢。

+1

请使用显式连接语法重写您的查询。 –

+0

我同意蒂姆加入语法会使这更容易排除故障,因为你的关系不清楚。 http://www.w3schools.com/sql/sql_join_inner.asp是一个关于内连接的文章,以防这是一个新概念。我马上看到的一个问题是,你没有将table_s定义为其他表的关系,这意味着这将创建一个交叉连接,并且可能会返回大量重复项,这可能也是为什么按性能划分或分组很差的原因。 – Matt

+0

嗨@ Matt/@ Tim,我同意使用显式连接(Inner/left outer join)并重新编写查询的建议。另一点,我不认为table_s可能是重复记录的原因,因为它与table_c有一个唯一的关系,而table_c是这个查询中的一个引导表。 Thanks- – HelloFriends

回答

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,添加所有列指定一个'唯一'行。

+0

传统连接语法不正确 - 这只是令人困惑。 – MT0

+0

我可能选择了错误的词,这不是我的意思。我想适当的会更好@ MT0 – sagi

+0

嗨@Sagi,我试过你的解决方案,这里是结果:1)如果我提供过滤条件,如table_c.id_number ='12345',那么它不会给我重复的记录。 2)如果我不应用任何过滤器,则查询在提供最初记录集时花费太多时间。所以我相信我们仍然有性能问题。谢谢 – HelloFriends