2013-06-05 115 views
11

我有关于以下语法的问题。有没有更清晰的方法可以将它们汇总成一个陈述而不是两个。我尝试了几次迭代,但这似乎是我能成功执行这两条语句的唯一方法。更新语句来更新多个行

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'); 

在这个Appriciate任何意见,顺便说一下,我使用的是SQL Server。 感谢

回答

18

试试这个,这将结合多种选择,并返回他们,如果他们来自DB:

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 
+0

是不是关键字'AS'缺少两次? – Zim84

+0

在这种情况下,我不使用'AS'关键字,因为这是不必要的。 – Devart

+0

@ Zim84,并感谢您的审查。 – Devart

7

我找了一个不太新手的方式

做两个单独的更新语句是(根据我)“不太新手的方式”,你可能会复杂的东西,并做这样的事情。

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') 

但是,这会给你带来什么?整个更新将在一个隐式事务中运行,所以如果您希望两次更新处于事务中,您只需使用begin transaction .... commit

+0

我最终在这个问题上,因为我在Google上搜索优化慢速(交互式)应用程序的方法,该应用程序可以在一分钟内完成大约100K的更新语句。切换到像建议的组合变体给了我们大约700%的加速,所以我们现在可以在不到10秒的时间内完成相同的工作。把它全部放在一个传输中并不会有帮助,因为它是大部分时间所有SQL语句的分派和往返时间。 – flodin

3

要添加到已经提到的其他方法:可以创建一个包含要执行的更新的临时表或表变量,然后运行将该表链接到要更新的表的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'); 

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; 
+1

这个shd是可以接受的答案,因为它适用于从已存在的表中更新n个行数 –