如何从SQL中的选定数据集创建临时结果集?

时间:2013-06-20 14:24:34

标签: sql oracle

出于调试目的,我想创建伪“结果集”以加入它们,例如:

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语法,以避免创建表调用..

3 个答案:

答案 0 :(得分:6)

我仍然不太确定你要做什么,但它看起来像你想要一个固定值的虚拟表。如果是这样,您可以从dualunion 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