2014-09-10 78 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