1

在 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 中做类似的事情?我真的不想创建一个视图来做到这一点。

4

3 回答 3

6

我相信它会扼杀“as”。

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

应该管用。

于 2008-10-30T19:26:47.393 回答
3

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

于 2008-10-30T19:27:27.503 回答
0

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

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

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

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

于 2008-10-30T21:27:21.737 回答