我正在尝试创建一个复杂的select查询,它使用临时表和语法,如下所示
with as
table1
( select start_date, end_date ....somequery - returns only 1 row ),
table2
( select ... somequery use table1 columns in where clause.. ),
table3
( select ... use table1 columns in where clause .. )
select * from
select case when ( start_date < sysdate -1000 and end_date > sysdate ) then 'table2' else 'table3' end from table1
where rownum < 10
所以基于table1的返回值,逻辑很简单我可能想查询表2或者可能想查询table3
问题:Oracle不允许在sql查询中动态生成表名
我知道我可以编写一个程序并使用EXECUTE IMMEDIATE但由于某种原因我必须通过单个查询完成所有操作。任何帮助将不胜感激。
答案 0 :(得分:2)
您可以为主select
执行类似的操作:
select *
from table1 cross join
table2
where start_date < sysdate - 1000 and end_date > sysdate and rownum < 10
union all
select *
from table1 cross join
table3
where not (start_date < sysdate - 1000 and end_date > sysdate) and rownum < 10
我们的想法是使用union all
来表示这两个条件,并使用where
来保证不会根据您的条件返回任何行。请注意,此where
语句形式未考虑NULL
或start_date
的{{1}}值。
如果有关于end_date
和table3`的更多详细信息可用,我怀疑可能有另一种方式来编写此查询。