#sql #sql-server #sql-update #subquery #sql-delete
#sql #sql-сервер #sql-обновление #подзапрос #sql-удалить
Вопрос:
Я уже некоторое время ломаю голову и без какого-либо результата. Честно говоря, я думаю, что мне нужен свежий взгляд на этот запрос. Я написал запрос, который удаляет данные из одной таблицы и помещает их в другую таблицу. Чего я действительно не могу понять, так это как обновить один столбец для тех строк, которые я перемещаю, в рамках того же запроса. Вот как выглядит запрос:
INSERT table1_archive
SELECT * FROM (
DELETE table
OUTPUT
DELETED.*
WHERE <condition1>
) AS RowsToMove;
Что я хочу, так это добавить также
UPDATE table1 SET <my_column> = "" WHERE <condition1>
Поскольку это одно и то же условие и таблица для удаления и обновления, я подумал, что нет смысла вызывать два разных запроса для выполнения некоторых действий для одних и тех же строк.
Я хочу удалить данные из <my_column> либо перед перемещением строк в table1_archive, либо после этого.
Я предполагаю, что мой вопрос таков: как бы мне применить эту инструкцию обновления к выбранным строкам, которые я собираюсь вставить в table1_archive?
ОТВЕТ
Этот вопрос становится немного избыточным, поскольку инструкция UPDATE не была необходимой для достижения того, чего я хотел. Я мог бы просто перечислить все мои столбцы в инструкции SELECT и заменить <my_column> на NULL или «‘.
Ответ №1:
Вы можете просто изменить столбец, который нужно обновить, в инструкции select.
INSERT INTO table1_archive
SELECT Col1,Col2...,"" AS <my_column> FROM (
DELETE table
OUTPUT
DELETED.*
WHERE <condition1>
) AS RowsToMove;
Комментарии:
1. Какое отличное маленькое хитрое решение. Спасибо. Я имел это в виду, но по какой-то причине это выскочило: D Есть ли какая-то конкретная причина, по которой я должен написать «КАК <my_column>» в инструкции Select, или я могу просто записать все мои столбцы и заменить <my_column> на null?
2. @Oskars, рад, что это полезно 🙂 . ‘AS <my_column> предназначен для именования вашего столбца как <my_column>. Если вы не напишете это, у столбца не будет никакого имени. Если вы хотите обновить NULL в качестве значения для этого столбца, тогда вам нужно записать NULL КАК <my_column>
3. подробнее об псевдонимах здесь ссылка
Ответ №2:
Вы можете сделать это с помощью одного оператора, но для этого требуется, чтобы вы перечислили столбцы.
Предполагая, что в ваших таблицах есть столбцы, (col1, col2, col3, mycol)
для которых mycol
должно быть установлено значение null
при копировании в архив, вы должны записать это как:
with del as (
delete ...
output deleted.*
where ...
)
insert into table1_archive (col1, col2, col3, mycol)
select col1, col2, col3, null
from del
Ответ №3:
а также вы можете попробовать это решение
UPDATE example_table1 table1 ,
(SELECT
my_column1, my_column2
FROM example_table2
WHERE
table1.my_column3=<condition1>
) table2
SET
table1.my_column1 = table2.my_column1,
table1.my_column2 = table2.my_column2
where table1.ID = table2.ID
Ответ №4:
UPDATE table1 SET
table1.my_column1= table2.my_column1
FROM
example_table1 AS table1
INNER JOIN example_table2 AS table2
ON table1.ID = table2.ID
WHERE
table1.my_column2 = <condition1>