动态SQL更新

时间:2013-02-12 15:09:31

标签: sql-server sql-server-2008 sql-update

我有以下SQL Server 2008表:

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)的结果值为“Disconnect”。示例更新语句如下:

    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
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

**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

提前感谢您寻求可能解决方案的任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用Last Result窗口功能查找第一个row_number()。但是,必须有一种方法来定义“第一”。在示例中,我假设您有一个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.

如果您没有标识列,请使用如何定义“first”更新问题。例如,可能有一个CreateDt列。