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

Posted

技术标签:

【中文标题】ORA-01446 - 无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID【英文标题】:ORA-01446 - cannot select ROWID from view with DISTINCT, GROUP BY, etc 【发布时间】:2012-03-21 14:29:21 【问题描述】:

我创建了一个在 select 子句中具有 distinct 的视图。

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

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

我正在寻找为什么会发生这种情况并得出了这个结论:

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

这很尴尬,因为视图中的 select 语句没有选择 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)

【问题讨论】:

能否请您发布您的视图定义? @Miguel - 您使用什么语言/框架/应用程序来执行查询?对于库来说,尝试透明地将ROWID 添加到SELECT 语句以确保结果中的每一行都有一个唯一的键是相对常见的。但是,通常情况下,库会更优雅地处理 ROWID 无法有效添加到查询的情况。 @Justin - 在代码(java,jdbc6)中,对视图的所有查询都运行良好(也因为我没有在任何查询中使用 *)。此错误在 SQLDeveloper 中。也许“问题”是,它试图透明地选择行ID...... @Amit - 我无法发布查询本身,但我可以发布类似的内容 你会发布这个定义你观点的类似查询吗?否则没有人可以帮助您。 【参考方案1】:

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

这根本没有意义

【讨论】:

【参考方案2】:

另一种可能性:在过去 3 天刚刚遇到此错误,我有另一种可能导致此错误的选项组合。

    您的查询使用 ANSI 样式的连接和 所涉及的一个或多个表是物化视图或表,已授予 QUERY REWRITE 选项

您可能会收到 Oracle 错误:

ORA-01445:无法从没有保留键的表的连接视图中选择 ROWID 或对其进行采样

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

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

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

ALTER SESSION SET QUERY_REWRITE_ENABLED = FALSE;

我们有后续问题:

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

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

【讨论】:

【参考方案3】:

由于查询中没有 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.

【讨论】:

以上是关于ORA-01446 - 无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID的主要内容,如果未能解决你的问题,请参考以下文章

Django Query distinct values 有效,但我无法使用查询结果

MySQL GROUP_CONCAT 返回重复值。无法使用 DISTINCT

Mysql DISTINCT 无法以我的语言正常工作

如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?

Mysql 选择查询计数和 Distinct 无法正常工作

Access 2010:该字段太小,无法接受您尝试添加的数据量 WITHOUT DISTINCT