【问题标题】:solution for ORA-00933ORA-00933 的解决方案
【发布时间】:2010-12-26 07:34:09
【问题描述】:

我正在尝试使用 join,但遇到了这个问题。我已经粘贴了我的查询

select count(*) from table_a inner 
                join table_b on table_a.number = table_b.number 
                left outer join table_c on table_a.id = table_c.id 
                     and table_a.number = table_c.number 
          order by number;

请告诉我查询中有什么问题...

-维诺德

【问题讨论】:

  • 唯一奇怪的是 order by - 所有三个表都有该列,但您的查询只会返回一行。
  • number 是一个保留字,所以如果这实际上是您正在使用的列名,我并不奇怪它会混淆。
  • 那是正确的,加里!我认为“数字”将是上下文的。他必须使用引号->“NUMBER”来逃避它。并且 order-by 部分既不起作用也不需要。

标签: sql oracle ora-00933


【解决方案1】:

您是否将此查询作为 INSERT 或 DELETE 的一部分执行? 如果是这样,请删除 ORDER BY。反正也不需要。

错误:ORA-00933:SQL 命令没有 正确结束

原因:你试图 执行一条 SQL 语句 不恰当的子句。

动作: 解决此 Oracle 错误的选项 是:

您可能执行了 INSERT 带有 ORDER BY 子句的语句。到 解决这个问题,删除 ORDER BY 子句并重新执行 INSERT 陈述。例如,您尝试 执行以下 INSERT 声明:

INSERT INTO supplier (supplier_id, supplier_name) VALUES (24553, 'IBM') ORDER BY supplier_id;

您可以更正 INSERT 语句 通过删除 ORDER BY 子句作为 如下:

INSERT INTO supplier (supplier_id, supplier_name) VALUES (24553, 'IBM');

您可能曾尝试执行 DELETE 带有 ORDER BY 子句的语句。到 解决这个问题,删除 ORDER BY 子句并重新执行 DELETE 陈述。例如,您尝试 执行以下 DELETE 声明:

DELETE FROM supplier WHERE supplier_name = 'IBM' ORDER BY supplier_id;

您可以更正 DELETE 语句 通过删除 ORDER BY 子句作为 如下:

DELETE FROM supplier WHERE supplier_name = 'IBM';

【讨论】:

  • ORDER BY 在插入语句中是合法的,并且广泛用于直接路径模式下的批量加载表,以提高特定列的集群因子或减少索引维护开销(特别是在加载索引组织表时) )
【解决方案2】:

您是如何执行此查询的?

在 Oracle SQL 中,没有像“;”这样的语句分隔符。那个仅用于 PL/SQL 中,并且某些工具允许您在文件/编辑器中放置多个语句,当您将它们用“;”分隔时。只是为了让他们可以单独执行它们。

长话短说:删除“;”然后再试一次。 哦,下一次,告诉我们你是如何运行查询的。我们必须检查我们的水晶球来猜测您的问题所在。

【讨论】:

    【解决方案3】:

    您不能按无法包含在结果集中的值进行排序。您的结果集将多行聚合成一行,每行都有自己的 NUMBER 值。因此 order by 没有逻辑意义。在这种情况下,您的查询仅返回一行,因此 ORDER BY 无关紧要。

    【讨论】:

      【解决方案4】:

      当您将查询转录为您在此处提供的 anodyne 测试用例时,您无意中更正了它。好吧,您引入了 ORA-00918 错误,但一旦修复,代码运行良好...

      SQL> create table table_a (col_1 number, id number)
        2  /
      
      Table created.
      
      SQL> create table table_b (col_1 number)
        2  /
      
      Table created.
      
      SQL> create table table_c (col_1 number, id number)
        2  /
      
      Table created.
      
      SQL>
      SQL>
      SQL> select count(*) from
        2  table_a inner join table_b on table_a.col_1 = table_b.col_1
        3  left outer join table_c on table_a.id = table_c.id
        4                         and table_a.col_1 = table_c.col_1
        5  order by col_1
        6  /
      order by col_1
               *
      ERROR at line 5:
      ORA-00918: column ambiguously defined
      
      
      SQL> select count(*) from
        2  table_a inner join table_b on table_a.col_1 = table_b.col_1
        3  left outer join table_c on table_a.id = table_c.id
        4                         and table_a.col_1 = table_c.col_1
        5  order by table_a.col_1
        6  /
      
        COUNT(*)
      ----------
               0
      
      SQL>
      

      注意:我已将 COL_1 替换为 NUMBER 作为列名。我不认为这是你的问题,因为在查询中使用未转义的 NUMBER 会抛出 ORA-1747 而不是 ORA-00933。

      所以,让我们排除明显的问题:您是否在不支持 ANSI 连接语法的旧版 Oracle 上运行,即 8i 或更早版本?

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 2010-11-22
        • 2015-08-24
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多