【问题标题】:Update fields in a SQL Server table sequentially按顺序更新 SQL Server 表中的字段
【发布时间】:2014-04-18 23:29:28
【问题描述】:

我有一个表 AoObject,其中有一列 DisplayName。名称中有 Joe SmithJohn SmithJane Smith 之类的值。这持续了数千条记录。

我想更新表格,以便从记录一开始到最后一条记录,DisplayName 的值是这样的。 Joe Smith = Customer1、John Smith = Customer2、Jane Smith = Customer3... 以此类推,直到所有名称列依次显示 Customer 并附加一个数字,而不是列的当前值。

这是 SQL Server 2012

***下面的例子不起作用,我已经修改了我的问题。没有包括足够的细节是我的错。该表称为 Aoobject。需要更改的字段实际上称为DisplayName。我需要使用以下内容过滤结果集。

Where ObjectDescription in ('Portfolio Description', 'Portfolio Group Description')

【问题讨论】:

  • 类似SET col=Customer + RANK(blah blah)

标签: sql sql-server-2012 sql-update


【解决方案1】:

这似乎是个坏主意——“客户编号”应该放在单独的列中。它不是名称的一部分。但是,这很容易做到:

with toupdate as (
      select t.*, row_number() over (order by recordnum) as seqnum
      from table t
     )
update toupdate
    set fullname = fullname + ' Customer' + cast(seqnum as varchar(255));

我假设您有一些记录编号 (recordnum),因为问题是“从记录一个到最后一个记录”。

编辑:

如果您希望名称唯一,则仅为重复名称附加一个数字。

with toupdate as (
      select t.*,
             row_number() over (partition by fullname order by recordnum) as fn_seqnum,
             count(*) over (partition by fullname) as fn_cnt
      from table t
     )
update toupdate
    set fullname = fullname + ':' + cast(fn_seqnum as varchar(255));
    where fn_cnt > 1;

这仅在需要时附加唯一编号(对于具有重复的全名)。而且,它使数字的基数尽可能低,因此后缀只需一位数字即可。

【讨论】:

  • 已有客户编号列。我只需要一种方法来保持名称的唯一性,一个数字就足够了。
  • 我在原始帖子中添加了更多详细信息。我省略了一些重要信息。
【解决方案2】:

这样的事情就可以了。 希望客户名称是唯一的。

;WITH cte_emp AS
(
SELECT CustomerName , ROW_NUMBER() over (order by CustomerName) slno
  FROM Customer
  )
UPDATE t SET CustomerName = 'Customer ' + cast(slno as varchar)
  FROM Customer t
 INNER JOIN cte_emp c ON t.CustomerName = c.CustomerName

【讨论】:

  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!
  • 我对我的问题做了一些修改。你能再看看吗?
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 2013-09-13
  • 2018-08-31
相关资源
最近更新 更多