2010-07-02 85 views
0

我有一個不幸的運氣,不得不處理包含特定記錄重複的數據庫,我正在尋找一種快速方式來說「獲取最多的記錄並更新重複項以匹配它」。如何選擇最豐富的記錄?

從那裏我可以選擇不同的記錄並獲得一組有用的記錄。

任何想法?

這是主要的名稱和地址是否有幫助?

好了很多的問題要求在這裏,我得加點點:

首先,我想拉「填充」最不最「流行」,這意味着值最大的行不是null。

一旦我有了設置(這很容易,因爲在我的情況下id的匹配),我可以填充其他行中的缺失值。

我不想破壞數據,我只打算根據精確匹配(例如通過id)更新數據。

我現在的問題是搞清楚哪一組行中有最多填充的字段,說過自發布這個問題以來,我發現了一種不同的方式來解決我發送到遠程的更大問題服務器,但我仍然有興趣知道這個解決方案可能是什麼。

的樣本數據可能是這個樣子......

id name  addr1   addr2  ect 
1 fred  1 the street  Some town ... 
1 fred  null    null  null 

給出一個完整的匹配對這樣的表,我想找到的對然後抓住一個在它的信息,並將這些值,其中另一行有一個空值。

+2

如何重複的記錄呈現的?所有字段是相同的?只有ID是不同的? – Oded 2010-07-02 14:43:41

+0

另外,什麼定義,「最流行」? – 2010-07-02 14:44:52

+0

@Tom H. - 我認爲這意味着大部分重複的記錄。 – Oded 2010-07-02 14:46:48

回答

0

請記住,您將有可能在這裏銷燬數據。僅僅因爲一行中填充的列數較少並不意味着它在填充的列中的準確性不夠高填充了

我假定重複項是由名爲「name」的列確定的。您需要根據您重複的定義進行調整。另外,既然你沒有給出關於如何處理「人口最稠密」的關係的規則,我只選擇了具有最低id的行。

UPDATE 
    T1 
SET 
    col_1 = T2.col_1, 
    col_2 = T2.col_2, 
    .... 
FROM 
    My_Table T1 
INNER JOIN My_Table T2 ON 
    T2.name = T1.name AND 
    T2.id = 
    (
     SELECT TOP 1 
      T3.id 
     FROM 
      My_Table T3 
     WHERE 
      T3.name = T1.name 
     ORDER BY 
      CASE WHEN col_1 IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN col_2 IS NOT NULL THEN 1 ELSE 0 END + 
      ... DESC, 
      id ASC 
    ) 

編輯:我剛纔重讀你的問題,你提到,「在那裏我可以選擇不重複的記錄,並獲得記錄的一組有用的。」如果這是你真正想要的,那就不必更新其他行,只需選擇你首先想要的人,離開一切不變:

SELECT 
    T1.id, 
    T1.name, 
    T1.col_1, 
    T1.col_2, 
    ... 
FROM 
    My_Table T1 
WHERE 
    T1.id = 
    (
     SELECT TOP 1 
      T2.id 
     FROM 
      My_Table T2 
     WHERE 
      T2.name = T1.name 
     ORDER BY 
      CASE WHEN T2.col_1 IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN T2.col_2 IS NOT NULL THEN 1 ELSE 0 END + 
      ... DESC, 
      T2.id ASC 
    ) 
+0

這裏的問題當然是這可能不會過濾出正確的結果,但我看到了你思想背後的邏輯。 – War 2010-07-08 15:07:21