2012-11-02 241 views
2

下面的语句:ORA-00936缺少表达

INSERT INTO TABLE1(COL_1,COL2) VALUES(SELECT MAX(COL_1) FROM TABLE1), 'XYZ'); 

引发错误:

ERROR at line 1: 
ORA-00936: missing expression 
at the select clause. 
1. The table is empty for now. 
2. COL_1 is a primary key intger field. 

你能帮助我吗?

+1

你有一个小错误。但是你的方法不好。如果你在col_1中没有任何价值,......你不能通过'SELECT MAX(COL_1)FROM TABLE1'得到任何结果......如果你在col_1中有一些值,那么你总是把最大值(a不变的价值)在第一列..这似乎没有改变这种方法..你想通过这种方式实现什么? – Sami

+0

我认为你正在尝试做一些像插入max(id)+1 ..你知道自动inrement吗? – Sami

回答

0

删除一个额外的支架

INSERT INTO TABLE1(COL_1,COL2) SELECT MAX(COL_1) , 'XYZ' FROM TABLE1 
+2

你说得对,括号的数目必须匹配,但是你选择了错误的解决方案。 – APC

+0

我的部分愚蠢的错误,编辑 – Buzz

3

尝试为

create table TABLE1 (COL_1 number, COL2 varchar2(5)); 

ALTER TABLE TABLE1 
add CONSTRAINT t_pk PRIMARY KEY (col_1); 

INSERT INTO TABLE1(COL_1,COL2) VALUES((SELECT nvl(MAX(COL_1),0) FROM TABLE1), 'XYZ'); 

INSERT INTO TABLE1(COL_1,COL2) VALUES((SELECT nvl(MAX(COL_1+1),0) FROM TABLE1), 'XYZ'); 

SQL Fiddle Demo

2

如果你想使用一个查询作为标量表达式的结果,包围整个(子)在括号中查询,如下所示:

INSERT INTO TABLE1(COL_1,COL2) VALUES (
    (SELECT MAX(COL_1) FROM TABLE1), 
    'XYZ' 
); 

在另一方面,你可以简单地使用different syntax,在这里:

INSERT INTO TABLE1(COL_1,COL2) 
SELECT MAX(COL_1), 'XYZ' 
FROM TABLE1 
group by 'XYZ'; 
+1

这两个解决方案有两个非常不同的结果。第一行插入一行,第二行为每个记录ib TABLE1插入一行。 – APC

+0

@APC:这很奇怪,在SQL Server中没有区别:[INSERT#1](http://sqlfiddle.com/#!3/02f3e/1),[INSERT#2](http://sqlfiddle.com /#!3/02f3e/2)。我的意思是,我永远不会指望这两个人在Oracle中有所不同。无论如何,最奇怪的部分是我[甚至不能测试](Oracle)中的第二个(即在SQL小提琴的Oracle中,我没有任何其他Oracle可用。)它一直告诉我该命令未正确结束。在Oracle中必须有一些我应该了解的“INSERT ... SELECT”,这对手册来说似乎不够明显(对我来说)。 –

+0

其实我的评论是错误的。没有GROUP BY子句,第二个解决方案*将不会运行。使用GROUP BY子句,它将返回一行。 – APC