从 Oracle 9i 中的嵌套查询中选择

Posted

技术标签:

【中文标题】从 Oracle 9i 中的嵌套查询中选择【英文标题】:Select from a nested query in Oracle 9i 【发布时间】:2008-10-30 19:24:35 【问题描述】:

在 MS SQL 2005 或 T-SQL 中,您可以执行以下操作:

SELECT T.NAME, T.DATE 
  FROM (SELECT * FROM MyTable WHERE ....) AS T

我未能在 Oracle 9i DB 上尝试类似的 SQL。在 MS SQL 中,嵌套 SQL 被视为动态创建并随后销毁的临时/动态视图。我怎样才能在 Oracle 中做类似的事情?我真的不想创建一个视图来做这件事。

【问题讨论】:

【参考方案1】:

我相信它会扼杀“as”。

SELECT T.NAME, T.DATE 
  FROM (SELECT * FROM MyTable WHERE ....)  T

应该可以。

【讨论】:

【参考方案2】:

您唯一需要更改的是删除关键字“AS”。 Oracle 仅将它用于列别名(例如 SELECT dummy AS some_name FROM dual),尽管即使那样你也不需要它。

【讨论】:

【参考方案3】:

如果您确实需要创建一个临时的物理结果集,那么您可以使用子查询分解子句来实现:

with t as
(SELECT /*+ materliaze */ 
        *
 FROM   MyTable
 WHERE ....)
SELECT T.NAME, T.DATE 
FROM T
/

除了优化器对查询中的中间结果集的准确估计对高效执行计划至关重要的特定情况外,通常不值得这样做,在这种情况下可以使用动态采样来查看结果集的大小,或者在查询的其余部分中多次使用计算结果集。

您应该能够只删除 AS,如果这样做是安全的,Oracle 会在逻辑上将内联视图合并到主查询中。

【讨论】:

以上是关于从 Oracle 9i 中的嵌套查询中选择的主要内容,如果未能解决你的问题,请参考以下文章

oracle 嵌套查询 子查询 自连接 等值连接条件

HiveQL SELECT语句查询

oracle如何查询嵌套表的分项

学说查询生成器中的嵌套选择查询

Oracle怎么嵌套查询

oracle的查询嵌套两层括号关联不上表