更新语句以更新多行

use*_*335 22 sql-server sql-update

我对以下语法有疑问.是否有更简洁的方法将其汇总到一个语句而不是两个语句中.我已经尝试了几次迭代,但这似乎是我成功执行这两个语句的唯一方法.

UPDATE employee
SET hire_date = '1979-03-15'
WHERE emp_id = 'PMA42628M' 

UPDATE employee
SET hire_date = '1988-12-22'
where emp_id = 'PSA89086M'; 
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个,我也尝试使用AND语句.都没有奏效.基本上我正在寻找一种不那么新手的方式然后上面的方法,如果存在的话.我花了很长时间搜索,却找不到一个.

UPDATE employee
SET hire_date = ('1979-03-15', '1988-12-22')
WHERE emp_id = ('PMA42628M', 'PSA89086M');
Run Code Online (Sandbox Code Playgroud)

对这个提出任何建议,顺便说一句,我使用的是sql server.谢谢

Dev*_*art 30

尝试这个,这将结合多个选择并返回它们,就好像它们来自数据库:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15'
    UNION ALL
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22'
) t ON t.emp_id = e.emp_id
Run Code Online (Sandbox Code Playgroud)

如果您使用的是SQL Server 2008或更高版本,则还可以对派生表使用不同的语法:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    VALUES
        ('PMA42628M', '1979-03-15'),
        ('PSA89086M', '1988-12-22')
) t (emp_id, hire_date) ON t.emp_id = e.emp_id
Run Code Online (Sandbox Code Playgroud)

  • @TT,这是个人喜好.:) (2认同)

Mik*_*son 9

我正在寻找一种不那么新手的方式

做两个单独的更新语句是(根据我)"新手更少的方式"你可以使事情复杂化并做这样的事情.

update employee
set hire_date = case emp_id
                  when 'PMA42628M' then '1979-03-15'
                  when 'PSA89086M' then '1988-12-22'
                end
where emp_id in ('PMA42628M', 'PSA89086M')
Run Code Online (Sandbox Code Playgroud)

但是你会得到什么呢?整个更新将在一个隐式事务中运行,因此如果您希望两个更新都在您刚刚使用的事务中begin transaction .... commit.

  • 我最终回答了这个问题,因为我一直在寻找一种方法来优化一个缓慢的(交互式)应用程序,该应用程序在一分钟内执行大约 100K 条更新语句。切换到建议的组合变体使我们的速度提高了大约 700%,因此我们现在可以在不到 10 秒的时间内完成相同的工作。将其全部放在事务中无济于事,因为它是所有 SQL 语句的调度和往返时间占用了大部分时间。 (2认同)

TT.*_*TT. 6

You can make a temporary table or a table variable containing the updates you want to do, then run the UPDATE statement linking the table to the table you intend to update.

Note that for two updates, you get two statements: the INSERT into the update table and the UPDATE statement itself. The number of statements remains two though for as many updates you need to do.

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL);
INSERT INTO #employee (emp_id,hire_date)
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05');

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL);
INSERT INTO #target_updates (emp_id,hire_date)
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22');
Run Code Online (Sandbox Code Playgroud)
UPDATE
    #employee
SET
    hire_date=tu.hire_date
FROM
    #employee AS e
    INNER JOIN #target_updates AS tu ON
        tu.emp_id=e.emp_id;

SELECT
    *
FROM
    #employee
ORDER BY
    emp_id;
Run Code Online (Sandbox Code Playgroud)
DROP TABLE #target_updates;
DROP TABLE #employee;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为它适用于更新已经存在的表中的 n 行 (4认同)