【问题标题】:Select from a nested query in Oracle 9i从 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 中做类似的事情?我真的不想创建一个视图来做这件事。

【问题讨论】:

    标签: oracle plsql


    【解决方案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 会在逻辑上将内联视图合并到主查询中。

        【讨论】:

          猜你喜欢
          • 2013-01-19
          • 1970-01-01
          • 2016-07-31
          • 1970-01-01
          • 2017-08-10
          • 2017-05-06
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          相关资源
          最近更新 更多