Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:在WITH子句中有条件地运行SELECT_Sql_Oracle_Common Table Expression - Fatal编程技术网

Sql Oracle:在WITH子句中有条件地运行SELECT

Sql Oracle:在WITH子句中有条件地运行SELECT,sql,oracle,common-table-expression,Sql,Oracle,Common Table Expression,我们有一个相当长的存储过程(Oracle 12),其中包含一系列WITH子句,它们以这种方式相互构建: WITH temp1 AS (SELECT ... FROM tableA WHERE ...), WITH temp2 AS (SELECT ... FROM temp1, tableB WHERE ...), WITH temp3 AS (SELECT ... FROM temp2, tableC WHERE ...), 从temp3实体中进行最终选择 SELECT ... FROM t

我们有一个相当长的存储过程(Oracle 12),其中包含一系列WITH子句,它们以这种方式相互构建:

WITH temp1 AS (SELECT ... FROM tableA WHERE ...),
WITH temp2 AS (SELECT ... FROM temp1, tableB WHERE ...),
WITH temp3 AS (SELECT ... FROM temp2, tableC WHERE ...),
从temp3实体中进行最终选择

SELECT ... FROM temp3;
这是可行的,但最近我们被要求“bookend”最终选择,这样它就有一个虚拟的第一行和一个虚拟的最后一行。即如果“temp3”包含三行,则最终选择将返回5行,包括两个虚拟行。但是,如果temp3不包含任何数据,则两个伪行也不应出现,并且用户将返回一个空记录集

如果temp3包含数据,我们如何开始装订最终选择,但如果temp3现在有行,则返回空记录集?

如何:

with temp1 as ( . . . ),
     temp2 as ( . . . ),
     temp3 as ( . . . )
select t
from (select dummyrow1 from dual union all
      select . . . from temp3 union all
      select dummyrow2 from dual
     ) t
where exists (select 1 from temp3);
如果您关心行的顺序,那么您应该在最外面的
选择
中包含一个
order by
,如何:

with temp1 as ( . . . ),
     temp2 as ( . . . ),
     temp3 as ( . . . )
select t
from (select dummyrow1 from dual union all
      select . . . from temp3 union all
      select dummyrow2 from dual
     ) t
where exists (select 1 from temp3);

如果您关心行的顺序,那么您应该在最外层的
select

中包含一个
order by
,或者无条件地插入两个bookend行(使用
UNION ALL
子句),但如果总行数仅为2,则再次对其进行过滤?您的查询是否按书面方式工作,在每个分解子查询之前重复使用关键字?我有点怀疑。虚拟行是硬编码的吗?或者它们是否依赖于任何一个分解子查询的数据?(除了只有在temp3为非空时才应添加它们的事实)也许可以无条件地插入两个bookend行(使用
UNION ALL
子句),但如果总行数仅为2,则再次对其进行过滤?您的查询是否按照编写的方式工作,在每个分解子查询之前重复关键字with?我有点怀疑。虚拟行是硬编码的吗?或者它们是否依赖于任何一个分解子查询的数据?(除了仅当temp3为非空时才应添加它们这一事实。)