当前位置: 首页 > 知识库问答 >
问题:

SQL Server 2008-使用匹配的记录更新多个值

鄢松
2023-03-14

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

例子:

--我有下面的表1和表2

表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条记录需要更新,并且您只看到表2中的前3个空白(NULL)得到更新。

表2(更新后)

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)

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

谢谢

共有2个答案

宗政霄
2023-03-14

我记不清该如何使用它,直到我重新开始工作,我才有一个例子。。但您可以通过使用光标,一次选择一行,并根据表1中特定行的数据进行更新来实现这一点。。

请参阅msdn上的帮助站点:http://msdn.microsoft.com/en-us/library/ms180169.aspx

更新:

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

游标所做的是从表1中逐个检索名称和数字。当您获取了这个名称后,它将更新表2,其中的名称与从表1中获取的名称匹配,并且表2中的数字为空。

    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
宇文俊明
2023-03-14
; 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
 类似资料:
  • 我知道以前有人问过这个问题,我已经阅读了很多答案,现在正在研究其中一个答案,但是我需要以下代码的帮助。 我在执行时没有收到任何错误,也没有任何内容提交到mysql表,如果你发现了什么,请告诉我,或者如果有更好的方法,请你给我指一个教程,我还没有太多的PDO或多行更新。 提前谢谢。 致山姆: 产出为:

  • 问题内容: 我在某些列中有一个带有嵌套表的oracle表。现在,我需要能够更新每个嵌套表,主表中每个记录中的所有记录。这是如何完成的?我尝试过的任何一种方法,都会收到有关无法在该视图上执行更新或单行子查询返回多个行的错误。 这是一个例子来说明。我可以运行这样的更新: 但是在这种情况下,table子句是在单行的单个嵌套表上执行的。如果您不只是想要等于2的entity.uidn,将如何执行这样的更新?

  • 假设我有一个员工姓名列表,我想选择具有这些姓名的所有行: 也许简和乔不在这张桌子上。我如何创建一个查询来标识我的列表中根本不存在的项目。 我不是在寻找任何特定的格式作为返回的结果;它可以是逗号分隔的,也可以是具有各自不匹配名称的行列表。

  • 更新记录 V2.0.0 加入寄存器运行模式,可大幅提升热更内数值计算性能 执行性能整体提升,传统非寄存器模式执行效率也得到一定幅度提升 修正热更内finnaly块在一些情况下不正确的bug,连带修复了yield return和async/await的一些异常情况 修正值对类型绑定后的数组进行操作时的异常 修正热更内Enum一些情况下Equals结果错误的bug 修正跨域继承接口时的一些异常情况 修

  •  版本更新记录 2016.09.10 1) 底层组件-新增时间处理集合 2016.09.5 1) 底层组件-优化防刷 2) 底层组件-错误监控 2) 底层组件-优化通过类名绑定相关事件 2016.08.25 1) 底层组件-新增百度统计组件 2016.08.11 1) 底层组件-优化udb定制登录,增加QQ登录 2) 活动组件-新增完成任务组件 2016.08.9 1) 活动组件-新增防刷组件

  • 我想更新值。如何在查询生成器中执行此操作?