37

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

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。谢谢

4

4 回答 4

46

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

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
于 2013-06-05T06:01:22.400 回答
13

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

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

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.

于 2013-06-05T06:24:32.260 回答
10

您可以创建一个临时表或包含要更新的表变量,然后运行将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;
于 2013-06-05T06:50:01.287 回答
-2

update table_name set='value' where orgid in (idnum1, idnum2)

于 2018-07-13T13:18:06.170 回答