Sql server Update语句以更新多行
我有一个关于以下语法的问题。有没有一种更干净的方法将其汇总为一个语句而不是两个语句。我尝试了多次迭代,但这似乎是我成功执行这两条语句的唯一方法Sql server Update语句以更新多行,sql-server,sql-update,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'; 我也尝试过这个,我也尝试过使用and语句。两者都不起作用。
UPDATE employee
SET hire_date = '1979-03-15'
WHERE emp_id = 'PMA42628M'
UPDATE employee
SET hire_date = '1988-12-22'
where emp_id = 'PSA89086M';
我也尝试过这个,我也尝试过使用and语句。两者都不起作用。基本上,我是在寻找一种不那么新手的方法,然后是上面的方法,如果有的话。我花了很长时间寻找,但没有找到
UPDATE employee
SET hire_date = ('1979-03-15', '1988-12-22')
WHERE emp_id = ('PMA42628M', 'PSA89086M');
如果您对此有任何建议,顺便说一句,我正在使用sql server。
感谢您尝试此选项,这将组合多个选择并返回它们,就像它们来自数据库一样:
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
如果您使用的是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
我正在寻找一种不那么新手的方式
按照我的说法,做两个单独的更新语句是“不太新手的方式”,你可以把事情复杂化,然后做类似的事情
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')
但这会给你带来什么好处呢?整个更新将在一个隐式事务中运行,因此如果希望两个更新在一个事务中,只需使用
begintransaction。。。。提交
您可以创建一个临时表或一个包含要执行的更新的表变量,然后运行UPDATE
语句,将表链接到要更新的表
请注意,对于两个更新,您会得到两条语句:将INSERT
插入更新表和update
语句本身。不过,对于需要执行的更新,语句的数量仍然是两个
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');
更新表\u name set='value',其中orgid in(idnum1,idnum2)关键字
AS
不是丢失了两次吗?在这种情况下,我不使用AS
关键字,因为它是不必要的。关键字AS
不是必需的,但为了更好的可读性,我们鼓励它。@TT,这是个人的偏好。:)@TT..........但经常在Oracle和非Oracle之间切换的人可能会感到气馁。(Oracle不支持表别名声明之前的AS
:,)我最终回答了这个问题,因为我在谷歌上搜索一种方法来优化一个缓慢(交互式)的应用程序,该应用程序在一分钟内执行大约100K条更新语句。切换到类似建议的组合变型给了我们大约700%的加速,所以我们现在在不到10秒内完成同样的工作。把它全部放在一个事务中并没有帮助,因为它是所有SQL语句的分派和往返时间,占用了大部分时间。这个shd是公认的答案,因为它也适用于从一个已经存在的表中更新n行数
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;
DROP TABLE #target_updates;
DROP TABLE #employee;