2013-02-12 96 views
1

我有以下SQL Server 2008表:动态SQL更新

 
ID Destination  Last Result 
01 (555) 319-5170 Disconnect 
02 (555) 319-5170 Duplicate 
03 (555) 319-5170 Duplicate 
04 (555) 261-5000 Duplicate 
05 (555) 261-5000 Duplicate 
06 (555) 261-7325 Busy 
07 (555) 261-7325 Duplicate 
08 (555) 261-7345 No Answer 
09 (555) 261-7345 Duplicate 

我的目标是动态设置“最后结果”列所有匹配的电话号码。因此,在上述目的地((555)319-5170)的示例表中,所有匹配电话号码(555)319-5170)的结果的值为“断开”。样品更新语句低于:

 
    UPDATE C 
    SET [Last Result] = (
    SELECT Destination 
       FROM Call 
       WHERE [Last Result] NOT IN ('Duplicate','No Phone #') 
       GROUP BY Destination 
       HAVING COUNT(Destination) > 1) 
    FROM Call C 
    INNER JOIN 
      (
       SELECT Destination 
       FROM Call 
       WHERE [Last Result] NOT IN ('Duplicate','No Phone #') 
       GROUP BY Destination 
       HAVING COUNT(Destination) > 1 
      ) Dup ON Dup.Destination = C.Destination 
    WHERE C.[Last Result] NOT IN ('Duplicate','No Phone #') 

但我得到一个错误:事先与可能的解决方案的任何援助

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

 
**EXPECTED OUTPUT**: 

ID Destination  Last Result 
01 (555) 319-5170 Disconnect 
02 (555) 319-5170 Disconnect 
03 (555) 319-5170 Disconnect 
04 (555) 261-5000 Duplicate 
05 (555) 261-5000 Duplicate 
06 (555) 261-7325 Busy 
07 (555) 261-7325 Busy 
08 (555) 261-7345 No Answer 
09 (555) 261-7345 No Answer 

感谢。

+0

表中的主键是什么? – 2013-02-12 15:19:38

+0

桌子上是否有标识栏?看起来你想填补最后的结果来掩盖“重复”记录。如果一个数字有'Disconnect','Duplicate','No Answer','Duplicate',你想要结果是什么? '断开','断开','没有答案','没有答案'?或者他们都应该'断​​开'?是否有可能有不同的非重复的[最后结果]值与相同的数字相关联? – 2013-02-12 15:23:48

+0

您的错误是由SET命令上的子查询可能返回多个结果引起的。您有[最后结果]不在('重复','没有电话号码'),但您的示例数据显示了更多可能的选项。 – 2013-02-12 15:25:07

回答

1

您可以使用row_number()窗口函数查找第一个Last Result。但是,必须有一种方法来定义“第一”。在这个例子中,我假设你有一个identity列:

update t1 
set  [Last Result] = t2.[Last Result] 
from Table1 t1 
join (
     select row_number() over (partition by Destination 
            order by Id) as rn 
     ,  * 
     from  Table1 
     ) t2 
on  t1.Destination = t2.Destination 
     and t2.rn = 1; 

Example at SQL Fiddle.

如果没有标识列,请你如何定义“第一”更新的问题。例如,可能有一个CreateDt列。

+0

ID列已添加到表格数据中。 @Andomar – user2051135 2013-02-12 16:02:31

+0

感谢您提供此解决方案。它对我试图解决的问题非常有用。 – user2051135 2013-02-12 20:08:51