Как мне добавить инструкцию Update к выбранным строкам, которые я собираюсь вставить в таблицу с помощью запроса MS SQL?

#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>