2013-02-12 97 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