Оператор обновления для обновления нескольких строк
У меня есть вопрос относительно следующего синтаксиса. Есть ли более чистый способ превратить это в одно утверждение, а не два. Я пробовал несколько итераций, но это, похоже, единственный способ, которым я могу успешно выполнить эти два утверждения.
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)