使用sql值集更新多行

使用sql值集更新多行,sql,sql-server,union,sequential,Sql,Sql Server,Union,Sequential,我想使用更新查询更新多行。有一个主键。我不想更新主键。假设 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) (“用户界面”,“udg6”,28) 如何使用“更新查询”按顺序用这些值

我想使用更新查询更新多行。有一个主键。我不想更新主键。假设

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)

(“用户界面”,“udg6”,28)


如何使用“更新查询”按顺序用这些值更新行?

您可以通过为现有值和新值分配行号来完成此操作。然后将此行号上的两个数据集合并,并相应更新:

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;

要更新的行数???与输入的行数相同,并且该表是一个结果集。使用TOP n。所以我可以检索任意数量的行。如果我有5组输入,我需要依次更新前5行。您可以简单地使用
更新集名称='…',年龄='…',地址='…',其中id=1
我们可以将其作为一个集进行更新吗。提供输入,如。。更新(“fsa”、“Sfsa”,40)@K9Code如果这回答了您的问题,请接受它(单击复选标记),这样其他人就不会浪费时间来解决您(已经解决)的问题。