2

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

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')

一个有效的结果集,所以我可以将它与连接关键字一起使用?

dual没有 v 列。我寻找一种方法来打破 SQL 语法以避免创建表调用..

4

3 回答 3

6

我仍然不太确定您要做什么,但在我看来您想要一个具有固定值的虚拟表。如果是这样,您可以从结果中选择多个虚拟值dualunion all这将为您提供多行。然后,您可以将其用作子选择,或者如果您有效地屏蔽了真实表(来自“调试”注释),那么 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,因此我将固定值别名为idCTE 内部(只需要在第一行中命名)。如果您愿意,您可以将其更改为其他内容。当然,您可以在每个 select from 中选择几个固定值(具有不同的别名),dual使其看起来更像一个真实的表格。

于 2013-06-20T14:55:52.683 回答
1

为此,您可以使用子查询分解,也称为“with 子句”</p>

with t as
( select v from dial where v in ('cat','dog','fish') )
Select * from t

Oracle 可能会决定是否在内部实现此结果集。如果你想控制这种行为,你可以使用优化器提示“materialize”和“inline”。

希望这可以帮助。

问候,
罗布。

于 2013-06-20T14:36:44.697 回答
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
于 2013-06-20T14:50:00.733 回答