【发布时间】:2022-02-16 22:03:53
【问题描述】:
我正在尝试根据唯一 ID 从我们的某些数据库中删除重复数据。所有已删除的数据应存储在单独的表中以供审核。由于它涉及相当多的数据库以及不同的模式和表,我想开始使用变量来减少出错的机会和我需要做的工作量。
这是我能想到的最好的示例查询,但它不起作用:
do $$
declare @source_schema varchar := 'my_source_schema';
declare @source_table varchar := 'my_source_table';
declare @target_table varchar := 'my_target_schema' || source_table || '_duplicates'; --target schema and appendix are always the same, source_table is a variable input.
declare @unique_keys varchar := ('1', '2', '3')
begin
select into @target_table
from @source_schema.@source_table
where id in (@unique_keys);
delete from @source_schema.@source_table where export_id in (@unique_keys);
end ;
$$;
查询语法适用于硬编码值。
大多数情况下,我的变量被视为列或根本无法识别。 :(
【问题讨论】:
-
@在 SQL 中的标识符中无效,对于 PL/pgSQL 中的变量也无效。另外:declare启动一个 block 来声明一个或多个变量。无需为每个变量启动一个新的声明块。另外:符合标准的create table new_table as select ...优于非标准的select into new_table from ... -
你需要 dynamic SQL 来做这个
-
还有一个关于plpgsql手册的链接:postgresql.org/docs/current/plpgsql.html
标签: postgresql sql-insert plpgsql sql-delete dynamic-sql