问题描述
我已经抽空了一段时间,没有任何结果。 老实说,我认为我需要对此查询重新审视。 我编写了一个查询,该查询从一个表中删除数据并将其放入另一个表中。我不能真正弄清楚的是,如何在同一查询中为我要移动的那些行更新一列。 这是查询的样子:
INSERT table1_archive
SELECT * FROM (
DELETE table
OUTPUT
DELETED.*
WHERE <condition1>
) AS RowsToMove;
我还想添加
UPDATE table1 SET <my_column> = "" WHERE <condition1>
由于要删除和更新的条件和表相同,所以我认为调用两个不同的查询对完全相同的行执行某些操作是没有意义的。
我想要的是在将行移动到table1_archive之前或之后将数据从
我猜我的问题是:如何将此更新语句应用于要插入到table1_archive中的选定行?
答案
这个问题变得有点多余,因为UPDATE语句对于实现我想要的不是必需的。我可以在SELECT语句中列出所有列,然后将
解决方法
您可以在单个语句中执行此操作-但这要求您枚举列。
假设您的表具有列(col1,col2,col3,mycol)
,其中mycol
在复制到归档文件时应设置为null
,则应这样写:
with del as (
delete ...
output deleted.*
where ...
)
insert into table1_archive (col1,mycol)
select col1,null
from del
,
您只需在select语句中操作要更新的列即可。
INSERT INTO table1_archive
SELECT Col1,Col2...,"" AS <my_column> FROM (
DELETE table
OUTPUT
DELETED.*
WHERE <condition1>
) AS RowsToMove;
,
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>
,
您也可以尝试此解决方案
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