2016-09-22 4 views
1

В MS SQL Server 2008 и новее, можно указать «буквальную» таблицу с использованием values как подзапрос:Как я могу конкретно указать таблицу «literal» в CTE?

select * from (
    values (1,2), 
     (3,4) 
) as foo(bar,baz) 

Однако, я не понял, разумный способ указать это в пункте with (КТР).

Я надеялся, что следующий будет работать, потому что он прекрасно работает в постоянно программистом дружественных PostgreSQL ... но она дает синтаксическую ошибку с SQL Server:

with foo(bar,baz) as (
    values (1,2), 
     (3,4) 
) 
select * from foo; 

Эта альтернативная форма работает но кажется чрезмерно излишним и подвержены ошибкам:

with foo as (
    select * from (
    values (1,2), 
     (3,4) 
) as foo(bar, baz) 
) 
select * from foo; 

есть ли более емкий способ определить буквенную таблицу в КТРЕ, в сервере SQL?

+1

Нет, в CTE нет хорошего пути. Этот ненужный SELECT меня раздражает! –

+1

Это в значительной степени и довольно стандартно для всех РСУБД. Похоже, что люди всегда хотят больше лаконичности в SQL, но это очень подробный язык, где часто бывает более явным выходом лучших результатов. – JNevill

+0

Правда. Наверное, я испорчен PostgreSQL, который на самом деле пытается сделать очевидные вещи такими, как это легко. : -/ –

ответ

1
with foo as (select 1 as bar, 2 as baz 
      union all 
      select 3, 4) 
select * from foo; 
+0

Это способ Oracle сделать это, и я бы не стал описывать это как «более кратким» :( –

+1

«Oracle» может потребовать «выбрать 1 как bar, 2 как baz из dual». –

+1

Это правда, Oracle даже * меньше * кратко :-P –