2014-10-29 69 views
1

我想使用更新查詢更新多行。有一個主鍵。我不想更新主鍵。假設使用更新查詢更新多行sql

id name address age 
1 as re3  20 
2 dg ht5  21 
3 hf ujy6 23 
4 ku tr5  25 

是表格。 我想按順序更新名稱,地址和年齡。 我有一組新值作爲輸入。像

( 「YJ」, 「ht43」,34)

( 「RT」, 「fd43」,36)

( 「HG」, 「hgd4」,40)

(「ui」,「udg6」,28)

如何用更新查詢順序更新具有這些值的行?

+0

你要多少行更新??? – 2014-10-29 07:34:25

+0

儘可能多的行我輸入 – 2014-10-29 07:35:25

+0

而表是結果集。使用TOP n。所以我可以檢索任意數量的行。如果我有5組輸入,我需要依次更新前5行 – 2014-10-29 07:37:06

回答

1

您可以通過爲現有值和新值分配行號來完成此操作。然後加入該行數的兩個數據集,並相應地更新:

WITH YourTableRanked AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY ID) 
    FROM YourTable AS t 
), NewValues AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY Name) 
    FROM (VALUES 
       ('yJ','ht43',34), 
       ('rt','fd43',36), 
       ('hg','hgd4',40), 
       ('ui','udg6',28) 
      ) AS t (Name, Address, Age) 
) 
UPDATE T 
SET  Name = v.Name, 
     Address = v.Address, 
     Age = v.Age 
FROM YourTableRanked AS t 
     INNER JOIN NewValues AS v 
      ON v.RowNum = t.RowNum; 

值得一提的是,任何種類的TOP,或排名操作或者不有效的語法,或在不存在的不是特別有用ORDER BY條款。因此,當您引用「順序」更新行時,爲了順序具有任何意義,您需要定義此序列的順序。在我發佈的查詢中,我已經在您的新值中訂購了Name,爲您的現有數據訂購了ID,但您可能希望對此進行更改以滿足您的需求。


完整的例子:

CREATE TABLE #T (ID INT, Name VARCHAR(2), Address VARCHAR(5), Age INT); 
INSERT #T (id, name, address, age) 
VALUES 
    (1, 'as', 're3', 20), 
    (2, 'dg', 'ht5', 21), 
    (3, 'hf', 'ujy6', 23), 
    (4, 'ku', 'tr5', 25); 

WITH YourTableRanked AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY ID) 
    FROM #t AS t 
), NewValues AS 
( SELECT t.*, 
      RowNum = ROW_NUMBER() OVER(ORDER BY Name) 
    FROM (VALUES 
       ('yJ','ht43',34), 
       ('rt','fd43',36), 
       ('hg','hgd4',40), 
       ('ui','udg6',28) 
      ) AS t (Name, Address, Age) 
) 
UPDATE T 
SET  Name = v.Name, 
     Address = v.Address, 
     Age = v.Age 
FROM YourTableRanked AS t 
     INNER JOIN NewValues AS v 
      ON v.RowNum = t.RowNum; 

SELECT * 
FROM #T; 

DROP TABLE #T; 
+0

ouff。謝謝..這是有幫助的。 :) – 2014-10-29 08:01:35

+1

@ K9Code如果這回答你的問題,請接受它(點擊選中標記),以便其他人不浪費時間試圖解決你已經解決的問題。 – 2014-11-15 00:18:30