![](/img/trans.png)
[英]What is the equivalent of Firebirds “STARTING WITH” when using other databases e.g. Oracle?
[英]What is the “lifespan” of a postgres CTE expression? e.g. WITH… AS
我有一个 CTE,我用来从两个表中提取一些数据,然后粘贴在一个名为cte_list
的中间表中,类似于
with cte_list as (
select pl.col_val from prune_list pl join employees.employee emp on pl.col_val::uuid = emp.id
where pl.col_nm = 'employee_ref_id' limit 100
)
然后,我正在执行插入操作以将记录从cte_list
移动到另一个名为employee_arch_test
存档表(如果它们不存在)
insert into employees.employee_arch_test (
select * from employees.employee where id in (select col_val::uuid from cte_list)
and not exists (select 1 from employees.employee_arch_test where employees.employee_arch_test.id=employees.employee.id)
);
这似乎工作正常。 问题是当我添加另一个语句后,使用前面提到的cte_list
从主employee
表中进行一些删除- cte_list 显然不再存在?
SQL Error [42P01]: ERROR: relation "cte_list" does not exist
实际的删除查询:
delete from employees.employee where id in (select col_val::uuid from cte_list);
cte_list
CTE 表只能使用一次吗? 我在 LOOP 中运行这些语句,我需要为大约 2 或 3 个其他表运行完全相同的调用,但在这里遇到了一个症结。
CTE 仅在其所属的语句的持续时间内存在。 我猜你有一个 INSERT 语句,前面有 CTE:
with cte_list
as (select pl.col_val
from prune_list pl
join employees.employee emp
on pl.col_val::uuid = emp.id
where pl.col_nm = 'employee_ref_id'
limit 100
)
insert into employees.employee_arch_test
(select *
from employees.employee
where id in (select col_val::uuid from cte_list)
and not exists (select 1
from employees.employee_arch_test
where employees.employee_arch_test.id = employees.employee.id)
);
CTE 是 INSERT 语句的一部分- 它本身不是一个单独的语句。 它仅在 INSERT 语句期间存在。
如果您需要更持久的东西,您的选择是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.