出于调试目的,我想创建伪“结果集”以加入它们,例如:
with tmp_tbl as ( select v from dual where v in ('cat', 'dog', 'fish') )
select read_tbl.* from tmp_tbl
left outer join read_tbl on real_tbl.id = tmp_tbl.id;
我理解上面的表达是无效的,可以转换成另一个有效的表达式。但我的真实例子太复杂了,无法在这里展示。
我的问题如何制作这个表达式:
select v from dual where v in ('cat', 'dog', 'fish')
有效的结果集,以便我可以将其用于加入和来自关键字?
双没有v列。我寻找一种方法来打破SQL语法,以避免创建表调用..
答案 0 :(得分:6)
我仍然不太确定你要做什么,但它看起来像你想要一个固定值的虚拟表。如果是这样,您可以从dual
和union all
结果中选择多个虚拟值,这将为您提供多行。然后,您可以将其用作子选择,或者如果您正在有效地屏蔽真实表(来自'debug'注释),那么CTE可能会更清晰:
with tmp_tbl as (
select 'cat' as id from dual
union all select 'dog' from dual
union all select 'fish' from dual
)
select tmp_tbl.id, read_tbl.*
from tmp_tbl
left outer join real_tbl
on real_tbl.id = tmp_tbl.id;
您在文本中引用了v
列,但是您加入id
,因此我在CTE中将固定值别名为id
(它只需要在第一行中命名)。如果您愿意,您可以将其更改为其他内容。当然,您可以在dual
的每个选择中选择几个固定值(具有不同的别名),使其看起来更像真实的表。
答案 1 :(得分:1)
为此,您可以使用subquery factoring,也称为“with子句”
with t as
( select v from dial where v in ('cat','dog','fish') )
Select * from t
Oracle可能决定在内部实现此结果集。如果要控制此行为,可以使用优化程序提示“materialize”和“inline”。
希望这有帮助。
的问候,
罗布。
答案 2 :(得分:1)
只需将查询括在括号中并为其命名,就可以根据需要在连接中使用它:
SELECT *
FROM ( select v from dial where v in ('cat', 'dog', 'fish') ) tmp_table
JOIN other_table ON tmp_table.v = other_table.v
WHERE tmp_table.v = xxx etc