我可以在多个DML语句中引用Sqlite CTE吗?
在一条语句中,我想更新一组行并删除另一组行,这两组行都基于某些CTE。然而,当我执行它时,第二个DML,DELETE,抱怨好像CTE不再可用。这在Sqlite中是不可能的吗 我看了一下,但我唯一发现的是在警告部分,那是关于复合语句的,这不是我在这里要做的 这是我的SQL,删除了CTE的内容,因为其中包含一些专有内容,而且我认为这与问题无关(如果不正确,请告诉我): 我还尝试在我可以在多个DML语句中引用Sqlite CTE吗?,sql,sqlite,common-table-expression,Sql,Sqlite,Common Table Expression,在一条语句中,我想更新一组行并删除另一组行,这两组行都基于某些CTE。然而,当我执行它时,第二个DML,DELETE,抱怨好像CTE不再可用。这在Sqlite中是不可能的吗 我看了一下,但我唯一发现的是在警告部分,那是关于复合语句的,这不是我在这里要做的 这是我的SQL,删除了CTE的内容,因为其中包含一些专有内容,而且我认为这与问题无关(如果不正确,请告诉我): 我还尝试在begintransaction中包装上述内容和提交事务但这没有帮助 错误消息是:“没有这样的表:cteOldAboutC
begintransaction中包装上述内容
和提交事务代码>但这没有帮助
错误消息是:“没有这样的表:cteOldAboutCmds”。CTE是单个SQL语句的一部分,这几乎就是它的全部要点
要使命名查询可用于多个语句,请使用。如果您不想影响其他连接,请使用临时视图。CTE是单个SQL语句的一部分,这几乎就是它的全部要点
要使命名查询可用于多个语句,请使用。如果您不想影响其他连接,请使用临时视图。我已经接受了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;
我已经接受了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;
否,通用表表达式
只能由紧跟其后的命令引用。也许您可以创建一个临时表。不,通用表表达式
只能由紧接着的以下命令引用。也许您可以创建一个临时表。谢谢,这让我找到了所需的解决方案。我也将回答我自己的问题,只是为了向其他人展示我的最终SQL,使用评论中不可用的格式化功能…谢谢,这让我找到了我需要的解决方案。我也将回答我自己的问题,只是为了向其他人展示我的最终SQL,使用注释中不可用的格式化功能…事务不是连接;您可能想放弃视图。谢谢您的建议。根据我的经验,Sqlite不会在事务完成后保留视图,而是本着清洁和完整的精神,以防我错了,它们会以某种方式保留,我添加了drop的。临时表/视图在连接期间保留。我刚刚想到,我通常会关闭连接,这可以解释这一点。事务不是连接;您可能想放弃视图。谢谢您的建议。根据我的经验,Sqlite不会在事务完成后保留视图,而是本着清洁和完整的精神,以防我错了,它们会以某种方式保留,我添加了drop的。临时表/视图在连接期间保留。我刚刚想到我通常会关闭连接,这可以解释这一点。