Оператор обновления для обновления нескольких строк

У меня есть вопрос относительно следующего синтаксиса. Есть ли более чистый способ превратить это в одно утверждение, а не два. Я пробовал несколько итераций, но это, похоже, единственный способ, которым я могу успешно выполнить эти два утверждения.

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-сервер. Благодаря

Ответ 1

Попробуйте это, это объединит несколько выборок и вернет их, как если бы они пришли из БД:

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

Ответ 2

Я ищу способ меньше новичков

Выполнение двух отдельных инструкций по обновлению (по моему мнению) "менее способ новичков" может усложнить работу и сделать что-то вроде этого.

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.

Ответ 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;

Ответ 4

обновить имя_таблицы set = 'value', где orgid в (idnum1, idnum2)