2014-10-29 60 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