2010-07-02 70 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