2016-06-26 91 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