postgres CTE 表达式的 "lifespan" 是什么?例如与...一样
What is the "lifespan" of a postgres CTE expression? e.g. WITH... AS
我有一个 CTE,我正在使用它从两个 table 中提取一些数据,然后插入一个名为 cte_list
的中间 table,类似于
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
移动到另一个存档 table (如果它们不存在)称为 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
- [=41] 从主 employee
table 中做一些 deletions =] 显然已经不存在了?
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 table 只能使用一次吗? 我是 运行在一个循环中使用这些语句,我需要 运行 对大约 2 或 3 个其他 table 进行完全相同的调用,但这里遇到了症结所在。
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 语句期间存在。
如果您需要更耐用的东西,您的选择是:
- 将相同的 CTE 添加到您的以下每个语句中。请注意,由于数据库中的数据可能会发生变化,因此 CTE 的每次调用都可能 return 不同的数据。
- 创建一个执行与 CTE 相同操作的视图,然后使用该视图代替 CTE。请注意,由于数据库中的数据可能会发生变化,因此每次调用视图都可能 return 不同的数据。
- 创建一个临时 table 来保存 CTE 查询中的数据,然后使用临时 table 代替 CTE。这样做的好处是可以为所有操作提供一致的数据集。
我有一个 CTE,我正在使用它从两个 table 中提取一些数据,然后插入一个名为 cte_list
的中间 table,类似于
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
移动到另一个存档 table (如果它们不存在)称为 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
- [=41] 从主 employee
table 中做一些 deletions =] 显然已经不存在了?
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 table 只能使用一次吗? 我是 运行在一个循环中使用这些语句,我需要 运行 对大约 2 或 3 个其他 table 进行完全相同的调用,但这里遇到了症结所在。
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 语句期间存在。
如果您需要更耐用的东西,您的选择是:
- 将相同的 CTE 添加到您的以下每个语句中。请注意,由于数据库中的数据可能会发生变化,因此 CTE 的每次调用都可能 return 不同的数据。
- 创建一个执行与 CTE 相同操作的视图,然后使用该视图代替 CTE。请注意,由于数据库中的数据可能会发生变化,因此每次调用视图都可能 return 不同的数据。
- 创建一个临时 table 来保存 CTE 查询中的数据,然后使用临时 table 代替 CTE。这样做的好处是可以为所有操作提供一致的数据集。