在一个语句中,我想更新一组行并删除另一组,两者都基于一些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"。
答案 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;