ORA-01446 - 无法从DISTINCT,GROUP BY等视图中选择ROWID

时间:2012-03-21 14:29:22

标签: sql oracle views ora-01446

我在select子句中创建了一个不同的视图。

当我尝试用“select * from view”选择所有记录时,我收到以下错误:

ORA-01446: cannot select ROWID from view with DISTINCT, GROUP BY, etc.

我正在寻找为什么会发生这种情况并且来到这里:

  

您尝试创建一个包含SELECT语句中的ROWID以及DISTINCT或GROUP BY等子句的视图。这是不允许的。 Reference

这很尴尬,因为视图中的选择部分没有选择rowid,也没有在任何其他子句(where,order等等)中使用。

对此有什么想法吗?

更新

我无法发布查询本身,但我发布了一个看起来像。这是:

SELECT DISTINCT t1.c1 TABLE1_C1,
t1.c2 TABLE1_C2,
t1.c3 TABLE1_C3,
t1.c4 TABLE1_C4,
t1.c4 TABLE1_C4,
t1.c5 TABLE1_C5,
t1.c6 TABLE1_C6,
t1.c7 TABLE1_C7,
t1.c8 TABLE1_C8,
t2.c1 TABLE2_C1,
t2.c2 TABLE2_C2,
t2.c3 TABLE2_C3,
t2.c4 TABLE2_C4,
t2.c5 TABLE2_C5,
t3.c1 TABLE3_C1,
t2.c6 TABLE2_C6,
t4.c1 TABLE4_C1,
t4.c2 TABLE4_C2,
t4.c3 TABLE4_C3
  FROM table1 t1
  LEFT JOIN table2 t2
  ON t1.c1 = t2.c7
  left JOIN table4 t4
  ON t4.c4 = t2.c1
  LEFT JOIN table3 t3
  ON (t2.c1 = t3.c2
  AND t2.c8 = t3.c3
  AND t2.c9 = t3.c4)
  WHERE (t2.cp5  = 0 or t2.cp5 is null)
  AND (t2.c3  =
    (SELECT MAX(c3)
    FROM table2 s_t2
    WHERE s_t2.c3 LIKE t2.c3
    AND s_t2.c7 = t1.c1
    ) or t2.c3 is null)

3 个答案:

答案 0 :(得分:1)

如果您使用distinct或group by rows,则可以限定条件。因此,不同的执行会返回不同的行ID,而另一个问题是,如果有几行符合哪一行会返回?

这根本没有意义

答案 1 :(得分:1)

由于查询中没有ROWID,因此不确定OP正在做什么。但这可能会有所帮助 - 只需添加一个列别名:

SQL>select  * from (select rowid from dual union select rowid from dual);
select  * from (select rowid  from dual union     select rowid from dual)
        *
ERROR at line 1:
ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.


SQL>select * from (select rowid as row_id from dual union select rowid from dual);

ROW_ID
------------------
AAAAB0AABAAAAOhAAA

1 row selected.

答案 2 :(得分:0)

另一种可能性:过去3天刚刚遭遇此错误,我有另外一组选项可能导致这种情况。

  1. 您的查询使用ANSI样式的连接和
  2. 所涉及的一个或多个表格是具有 QUERY REWRITE 选项的物化视图或表格
  3. 您可能会收到Oracle错误:

    ORA-01445 :无法从没有密钥保留表的连接视图中选择ROWID或采样

    我们终于发现大型查询中的2个表设置了此选项并抛出此错误。已经为这两个表的模式授予了权限。

    确定这是原因需要很长时间,因为,1)表由另一个团队拥有,2)表已经授予我们的架构QUERY REWRITE权限,但查询(在日常工作中编译)没有在系统更新后3周后才会失败。

    授予此权利的团队已将其撤消,但问题仍然存在。因此,我们对日常工作的短期解决方法是在行动中添加以下内容:

    ALTER SESSION SET QUERY_REWRITE_ENABLED = FALSE;
    

    我们的后续问题:

    1. 我们仍在思考如何强制优化器重新解析查询以识别我们不再拥有此授权,但可能需要重新启动系统。

    2. 虽然我认识到物化视图会产生物理表,但我知道 还在问自己为什么表不是mview的一部分 将被授予此权利。