ORA-00933的解决方案

时间:2009-12-14 04:23:32

标签: sql oracle ora-00933

我正在尝试使用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;

请告诉我查询中的错误...

-Vinod

4 个答案:

答案 0 :(得分: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';

答案 1 :(得分:1)

您是如何执行此查询的?

在Oracle SQL中,没有像“;”这样的语句分隔符。那个只用在PL / SQL中,当你用“;”分隔它们时,一些工具允许你在文件/编辑器中放置多个语句。只有这样他们才能分别执行它们。

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

答案 2 :(得分:1)

当您将查询转录到此处出现的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或更早?

答案 3 :(得分:1)

您无法通过无法包含在结果集中的值进行排序。您的结果集将多行(每个行都有自己的NUMBER值)聚合到一行中。因此,顺序不具有逻辑意义。在这种情况下,您的查询只返回一行,因此ORDER BY无关紧要。