子查询可以与VALUES关键字一起使用吗?

时间:2014-01-19 18:38:18

标签: sql subquery oracle-xe dml

我的印象是它不能,但后来我遇到了这两个例子(使用Oracle XE和SQL Developer):

示例1 - 执行无错误

insert into regions (region_id, region_name)
values ((select max(region_id)+1 from regions), 'Great Britain');

示例2 - 返回错误(如下所示)

insert into regions (region_id, region_name)
values (select region_id, region_name from regions);

错误:

Error starting at line 1 in command:
insert into regions (region_id, region_name)
values (select region_id, region_name from regions)
Error at Command Line:2 Column:9
Error report:
SQL Error: ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:

所以,它似乎还有更多。任何人都可以解释在什么条件下使用VALUES关键字包含子查询是不是没有问题?

1 个答案:

答案 0 :(得分:3)

您需要在括号中插入子查询。 values的开放时间不计算在内。它是列表的开头,而不是子查询。当返回一行和一列时,您可以在VALUES子句中包含子查询。

相反,您可以使用以下语法:

insert into regions (region_id, region_name)
    select max(region_id) + 1, 'Great Britain'
    from regions;

更好的是将序列分配给region_id(其他数据库中的标识或自动增量列),以便自动分配。那你就做:

insert into regions (region_name)
    select 'Great Britain'
    from dual;
相关问题