动态SQL更新
我有以下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
感谢。
您可以使用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;
如果没有标识列,请你如何定义“第一”更新的问题。例如,可能有一个CreateDt
列。
ID列已添加到表格数据中。 @Andomar – user2051135 2013-02-12 16:02:31
感谢您提供此解决方案。它对我试图解决的问题非常有用。 – user2051135 2013-02-12 20:08:51
表中的主键是什么? – 2013-02-12 15:19:38
桌子上是否有标识栏?看起来你想填补最后的结果来掩盖“重复”记录。如果一个数字有'Disconnect','Duplicate','No Answer','Duplicate',你想要结果是什么? '断开','断开','没有答案','没有答案'?或者他们都应该'断开'?是否有可能有不同的非重复的[最后结果]值与相同的数字相关联? – 2013-02-12 15:23:48
您的错误是由SET命令上的子查询可能返回多个结果引起的。您有[最后结果]不在('重复','没有电话号码'),但您的示例数据显示了更多可能的选项。 – 2013-02-12 15:25:07