【问题标题】:Oracle 22 Joins or over is not allowed in a select statement ? ORA-01445选择语句中不允许 Oracle 22 Joins 或 over 吗? ORA-01445
【发布时间】:2011-11-18 13:21:39
【问题描述】:

ORA-01445: 无法从没有 密钥保留表

我有一个关于 ORACLE 10g 的长选择语句。 根据这个错误声明,我在google上看到了一些答案。答案之一是这样说;

* 连接中的表数限制我遇到了一个不寻常的错误 (4204878/ 3765373/ 3004824) 在 Oracle 9.2.0.5 上。当超过 22 ANSII 连接是在选择语句中完成的,出现 ORA-01445。根据 支持“1-一所以”

我计算整个选择块内的连接数;是 23(在 select 和 where 子句之后)。 具有此“select”t 语句的 SP 运行良好,直到我在 where 子句之后添加了此新联接...

简而言之,我已经通过禁用现有连接之一进行了测试,并启用了我新添加的连接并且 SP 正常工作。

你认为真的有什么限制吗?

** 我不能给你网站地址,因为 StackOverflow 的用户总是发现它在抹黑..

【问题讨论】:

    标签: sql oracle join limit


    【解决方案1】:

    我遇到过几次这些错误。它在 9i 中使用 ANSI 连接发生了很多,我发现它在 10g 中发生的频率较低。

    一种解决方法是重写连接以使用“旧”连接合成器,特别是 APC 指出的外部连接:

    SELECT *
      FROM a, b
     WHERE a.a_id = b.a_id (+)
    

    【讨论】:

    • 这方面的几个错误特别指出了 ANSI OUTER JOIN 语法,以及使用旧 Oracle (+) 语法的解决方法
    【解决方案2】:

    我已经通过选择我在查询中使用的列解决了这个问题。

    从这里:

    select a.column1, b.column3
      from a
      join b on b.column2 = a.column2
    

    到这里:

    select a.column1, b.column3
      from (select column1, column2 from a) a
      join (select column2, column3 from b) b on b.column2 = a.column2
    

    【讨论】:

    • 一个更好的答案,我过去不得不求助于自己。似乎是具有大量列的表可能会引发此问题,因此 Oracle 可能对加入的 columns 数量有一些隐式限制,具体取决于解释计划。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多