2014-09-10 63 views
0

我喜欢在一列上进行匹配并更新两个表之间的另一列的值。让我来演示如何更新它。SQL Server 2008 - 使用匹配记录更新多个值

例子:

- 我有Table 1和Table下面

表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) 

我不知道这是可能的。请帮忙。

感谢,

+1

“First”,按什么排序?你还使用什么rdbms? – 2014-09-10 19:55:15

+0

不需要按照顺序,只是任何第一个可用的空白匹配。谢谢 – Milacay 2014-09-10 21:30:35

+0

那么你想使用相同的,第一个数字,或者你想采取不同的数字?更新后,您想要的结果包含不同的'abc'数字。 – 2014-09-10 21:51:29

回答

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 
+0

非常感谢。这是最好的解决方案。 – Milacay 2014-09-11 15:42:01

1

我不记得究竟如何使用它,我没有一个例子,直到我重新工作。但是你可以用光标,选择了单行实现这一目标在时间和更新它的基础上,从表1中的特定行的数据..

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

UPDATE:

我有n个ow构建了一小段代码,可以完成你所要求的功能;-)见下文。

游标的作用是从table1中一个一个地检索名字和数字。当你提取这个数据时,它将更新表2,其中名称与表1中的提取名称相匹配,并且表2中的数字为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 
+0

不知道我该怎么做,但是谢谢你的建议 – Milacay 2014-09-10 21:51:21

+0

看到更新的答案;-) – ssn 2014-09-11 07:05:01

+0

谢谢@Steffen,我也会尝试你的方法。 – Milacay 2014-09-11 15:42:52