我可以在多个DML语句中引用Sqlite CTE吗?

时间:2016-03-13 00:50:48

标签: sql sqlite common-table-expression

在一个语句中,我想更新一组行并删除另一组,两者都基于一些CTE。但是,当我执行它时,第二个DML,即DELETE,就像CTE不再可用一样抱怨。这在Sqlite中是不可能的吗?

我查看了WITH reference for Sqlite,但我发现的唯一一件事就是在警告部分,这是关于复合语句,这不是我在这里所做的。

这是我的SQL,删除了CTE的内容,因为它有一些专有的东西,因为我不认为这个问题很重要(但请告诉我,如果这样做的话)不正确):

with cteOldAboutCmds as (
  ...
)
, cteFrequency as (
  ...
)
, cteNewAboutCmdMaster as (
  ...
)

update cmds 
set freqrankalltime = freqrankalltime + (select fr from cteFrequency) 
where id = (select id from cteNewAboutCmdMaster);

delete 
from cmds
where id in (select id from cteOldAboutCmds);

我也尝试在begin transaction;commit transaction;中包含上述内容,但这并没有帮助。

错误信息是:"没有这样的表:cteOldAboutCmds"。

2 个答案:

答案 0 :(得分:0)

CTE是单个SQL语句的一部分,这几乎是它的重点。

要使命名查询可用于多个语句,请使用views。如果您不想影响其他连接,请使用临时视图。

答案 1 :(得分:0)

我已经接受了CL的回答,但是我想格式化我最终使用的代码,为了其他人的利益:

begin transaction;

create temp view OldAboutCmds as
select *
from...;

create temp view Frequency as
select...;

create temp view NewAboutCmdMaster as
select...;

update cmds 
set ...
where ...;

delete 
from cmds
where ...;

commit transaction;

drop view OldAboutCmds;
drop view Frequency;
drop view NewAboutCmdMaster;