为什么我不能将两个sql命令与Postgresql中的“with”语句捆绑在一起?

为什么我不能将两个sql命令与Postgresql中的“with”语句捆绑在一起?,sql,postgresql,Sql,Postgresql,with语句是否与多个sql命令一起工作? 我必须删除两个表中的条目。我的sql如下: with tbd as ( SELECT (row_value ->> 'id')::INTEGER FROM public.row_history where record_table = 'survey_storage' and row_value ->> 'status' = 'Never Surveyed' except (SELECT (row_valu

with语句是否与多个sql命令一起工作? 我必须删除两个表中的条目。我的sql如下:

with tbd as (
 SELECT (row_value ->> 'id')::INTEGER 
 FROM public.row_history 
 where record_table = 'survey_storage' 
 and row_value ->> 'status' = 'Never Surveyed' 
 except
  (SELECT (row_value ->> 'id')::INTEGER 
   FROM public.row_history 
   where record_table = 'survey_storage' 
   and row_value ->> 'status' = 'Ready to Launch') 
  limit 1)
delete from row_history where (row_value ->> 'id')::INTEGER = ANY(ARRAY(select * from tbd)) 
delete from survey_storage where id = ANY(ARRAY(select * from tbd))
这不起作用。在2个delete语句中,如果你注释掉一个,那么另一个也可以。但是它们连在一起都不能编译。我肯定可以用1个delete编写2个sql脚本,但我想一次性完成。 我得到这个错误:

SQL Error [42601]: ERROR: syntax error at or near "delete"
                   Position: 410
                   ERROR: syntax error at or near "delete"
                   Position: 410
                   ERROR: syntax error at or near "delete"
                   Position: 410
您可以执行以下操作:

with tbd as (
 SELECT (row_value ->> 'id')::INTEGER 
 FROM public.row_history 
 where record_table = 'survey_storage' 
 and row_value ->> 'status' = 'Never Surveyed' 
 except
  (SELECT (row_value ->> 'id')::INTEGER 
   FROM public.row_history 
   where record_table = 'survey_storage' 
   and row_value ->> 'status' = 'Ready to Launch') 
  limit 1)
), cte2 as (
  delete from row_history 
     where (row_value ->> 'id')::INTEGER 
                        = ANY(ARRAY(select * from tbd))
)
delete from survey_storage
     where id = ANY(ARRAY(select * from tbd));
您可以执行以下操作:

with tbd as (
 SELECT (row_value ->> 'id')::INTEGER 
 FROM public.row_history 
 where record_table = 'survey_storage' 
 and row_value ->> 'status' = 'Never Surveyed' 
 except
  (SELECT (row_value ->> 'id')::INTEGER 
   FROM public.row_history 
   where record_table = 'survey_storage' 
   and row_value ->> 'status' = 'Ready to Launch') 
  limit 1)
), cte2 as (
  delete from row_history 
     where (row_value ->> 'id')::INTEGER 
                        = ANY(ARRAY(select * from tbd))
)
delete from survey_storage
     where id = ANY(ARRAY(select * from tbd));

@穿刺者,谢谢你的回答。尝试为完全相同的内容创建存储过程。它不喜欢。因此我将使用2个脚本或2个存储过程。你可以使用多个cte,并在其中写入每个delete语句。@abdusoli,gr8。它起作用。我将第一个delete包装在第二个cte中,并保持第二个delete不变。它起作用了。如果你将您的评论转换为我将接受的答案。谢谢。@Abdusoli我已更正。这似乎是PostgreSQL的一个扩展,总是让我感到惊讶。我还尝试了Oracle、DB2、MySQL、MariaDB和SQL Server,但没有用。总之,很高兴知道它可以在PostgreSQL中完成。@Impaler,谢谢您的回答。尝试创建存储过程re用于完全相同的内容。它不喜欢。因此,我将使用2个脚本或2个存储过程。您可以使用多个cte,并在其中写入每个delete语句。@abdusoli,gr8。它工作正常。我将第一个delete包装在第二个cte中,并保持第二个delete不变。它工作正常。如果您将注释转换为答案,我将接受。谢谢。@abdusoli I st并更正。这似乎是PostgreSQL的一个扩展,总是让我感到惊讶。我还尝试了Oracle、DB2、MySQL、MariaDB和SQL Server,但都没有成功。无论如何,知道它可以在PostgreSQL中完成是件好事。