【问题标题】:SQL Server 2008 - Update Multiple Values With Matched RecordSQL Server 2008 - 使用匹配记录更新多个值
【发布时间】:2014-09-10 19:53:15
【问题描述】:

我喜欢在一个列上进行匹配并更新两个表之间另一列的值。让我演示一下我喜欢它如何更新。

例子:

-- 我下面有Table1和Table2

表 1:

Name  Number
--------------
abc   1111
abc   2222
abc   3333
xyz   4444
xyz   5555
xyz   6666

表2:

Name  Number
-------------
abc   9999 (already exists, before updated)
abc   NULL
abc   NULL
abc   NULL
abc   NULL
abc   NULL
abc   NULL
xyz   NULL
xyz   NULL
xyz   NULL
xyz   NULL
xyz   NULL
xyz   8888 (already exists, before updated)

我想在 Table1 和 Table2 之间进行匹配,并更新 Table2 以获取空白 (NULL) 的匹配名称,以及 Table1 中的第一个匹配记录。如您所见,“abc”只有 3 条记录需要更新,而您看到 Table2 中只有前 3 条空白(NULL)被更新。

Table2(更新后)

Name  Number
--------------
abc   9999 (already exists, before updated)
abc   1111
abc   2222
abc   3333
abc   NULL
abc   NULL
abc   NULL
xyz   4444
xyz   5555
xyz   6666
xyz   NULL
xyz   NULL
xyz   8888 (already exists, before updated)

我不确定这是否可能。请帮忙。

谢谢,

【问题讨论】:

  • “第一”,按什么排序?还有你用的是什么 rdbms?
  • 不需要按照顺序,只要匹配任何第一个可用的空白即可。谢谢
  • 那么你想使用相同的第一个数字还是你想使用不同的数字?您想要的结果包含更新后abc 的不同数字。
  • 对不起,我更新了我的帖子。基本上,'abc", "9999" 和 "xyz" 8888 已经存在,不要更新已经有值的。我只想找到刚刚的空/空白/Null 并更新它们。
  • ...您只想更新这么多在 table1 中有对应项的记录?所以你不想取任意数量的同名来更新table2中的所有空记录?

标签: sql sql-server-2008


【解决方案1】:
; WITH tbl1 as (
SELECT Name, Number, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Number) rn
FROM Table1)
,tbl2 as (
SELECT Name, Number, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Number) rn
FROM Table2
WHERE Number IS NULL)

UPDATE tbl2
    SET Number = tbl1.Number
FROM tbl2
    INNER JOIN tbl1 ON tbl2.Name = tbl1.Name AND tbl2.rn = tbl1.rn

【讨论】:

  • 非常感谢。这是最好的解决方案。
【解决方案2】:

我不记得具体如何使用它,在我再次开始工作之前我没有示例。但是您可以通过使用游标并一次选择一行并根据更新它来实现这一点表 1 中特定行的数据..

查看 msdn 上的帮助站点:http://msdn.microsoft.com/en-us/library/ms180169.aspx

更新:

我现在已经构建了一小段代码,可以满足您的要求;-) 见下文。

游标的作用是从 table1 中逐一检索名称和编号。当您获取此信息时,它将更新表二,其中名称与从表一中获取的名称匹配并且表二中的数字为 NULL。

    DECLARE @name nvarchar(max)
    DECLARE @number int

    DECLARE name_cursor CURSOR FOR 
        SELECT name, number
        FROM #table1

    OPEN name_cursor

    FETCH NEXT FROM name_cursor
    INTO @name, @number

    WHILE @@FETCH_STATUS = 0
    BEGIN

        UPDATE top(1) #table2
        SET number = @number
        FROM #table2
        WHERE
            name = @name
            and number is null

        FETCH NEXT FROM name_cursor
        INTO @name, @number

    END
    CLOSE name_cursor
    DEALLOCATE name_cursor

【讨论】:

  • 谢谢@Steffen,我也会试试你的方法。
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2019-07-15
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多