2013-06-05 143 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個行數 –