sql - 使用一组值 sql 更新多行

标签 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)

("ui","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;

关于sql - 使用一组值 sql 更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26624874/

相关文章:

sql-server - 将一张表中的 SQL 列分组

sql-server - SQL 过程中的打印语句会影响性能吗?

mysql - 在 MYSQL 中的两个或多个临时表的表末尾显示总和/总计

mysql请求如果不存在

sql - 使用 LIKE 语句查询任何单词,而不是整个单词

php - mysql脚本仅重新加载

sql - sql server中的累计计算

sql-server - SQLServer 在单个语句中编写 union

mysql - 带有单个参数的 sql IN 子句是否与单列查询相同?

php - Doctrine2 QueryBuilder NOT IN 语句不起作用