2014-01-19 3 views
2

я был под впечатлением, что он не мог, но потом я наткнулся на этих 2 примерах (с использованием Oracle XE и SQL Developer):Можно ли использовать подзапрос с ключевым словом VALUES?

Пример 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?

ответ

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; 
+1

Получил - так, в предложении 'VALUES' разрешены только скалярные подзапросы? –

+1

@JeffLevine. , , Да, это хороший способ сказать это. Я избегаю предложения 'VALUES' просто потому, что' insert. , , select' делает все, что он делает, и многое другое. –