【问题标题】:Dynamic SQL Update动态 SQL 更新
【发布时间】:2013-02-12 15:09:30
【问题描述】:

我有以下 SQL Server 2008 表:

ID 目的地 最后结果 01 (555) 319-5170 断开连接 02 (555) 319-5170 重复 03 (555) 319-5170 重复 04 (555) 261-5000 重复 05 (555) 261-5000 重复 06 (555) 261-7325 忙 07 (555) 261-7325 重复 08 (555) 261-7345 无应答 09 (555) 261-7345 重复

我的目标是为所有匹配的电话号码动态设置“最后结果”列。因此,在上面的 Destination((555) 319-5170) 示例表中,所有匹配电话号码 (555) 319-5170) 的结果为“断开连接”。更新语句示例如下:

更新 C SET [最后结果] = ( 选择目的地 从呼叫 WHERE [Last Result] NOT IN('重复','没有电话号码') 按目的地分组 HAVING COUNT(目的地) > 1) FROM 呼叫 C 内部联接 ( 选择目的地 从呼叫 WHERE [Last Result] NOT IN('重复','没有电话号码') 按目的地分组 HAVING COUNT(目的地) > 1 ) Dup ON Dup.Destination = C.Destination WHERE C.[Last Result] NOT IN ('Duplicate','No Phone #')

但我收到一个错误:

消息 512,第 16 级,状态 1,第 1 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

**预期输出**: ID 目的地 最后结果 01 (555) 319-5170 断开连接 02 (555) 319-5170 断开连接 03 (555) 319-5170 断开连接 04 (555) 261-5000 重复 05 (555) 261-5000 重复 06 (555) 261-7325 忙 07 (555) 261-7325 忙 08 (555) 261-7345 无应答 09 (555) 261-7345 无应答

在此先感谢您就可能的解决方案提供任何帮助。

【问题讨论】:

  • 表中的主键是什么?
  • 你的桌子上有标识列吗?看起来您正在尝试填写最后一个结果以掩盖“重复”记录。如果一个号码有“断开连接”、“重复”、“无应答”、“重复”,您希望结果是什么? “断开连接”、“断开连接”、“无应答”、“无应答”?或者他们都应该“断开连接”?甚至可能有不同的非重复 [Last Result] 值与相同的数字相关联?
  • 您的错误是由于您的 SET 命令上的子查询可以返回多个结果造成的。您有 [Last Result] NOT IN ('Duplicate','No Phone #'),但您的示例数据显示了更多可能的选项。
  • 表数据中增加了ID列@Raj More
  • @user2051135,您的 ID 列看起来像一个自动增量。所以对于电话号码(555) 319-5170,您的最新状态实际上是断开连接

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


【解决方案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 列。

【讨论】:

  • ID 列已添加到表数据中。 @Andomar
  • 感谢您提供此解决方案。它非常适合我试图解决的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2012-10-28
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多