2016-09-22 2 views
1

, 그것은 하위 쿼리로 values를 사용하여 "문자"테이블 지정할 수있다 : 그러나어떻게 CTE에서 "리터럴"테이블을 간결하게 지정할 수 있습니까? MS SQL Server 2008 및 새로운에서

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

을, 나는 with 절에이 지정하는 합리적인 방법을 생각하지 않은 (CTE).

나는 그것이 지금까지 프로그래머 친화적 인 PostgreSQL의에서 잘 작동합니다 ...하지만 SQL Server에서 구문 오류를 제공하기 때문에, 일하는 것이 다음을 기대했다

:

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

이 다른 형태 작동합니까 CTE를에 리터럴 테이블을 지정하는 더 간결한 방법은 SQL 서버에, 거기에

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

:하지만 과도하게 중복 및 오류가 발생하기 쉬운 것 같습니다?

+1

아니요 CTE에 좋은 방법이 없습니다. 그 불필요한 SELECT는 나를 귀찮게한다! –

+1

그것은 모든 RDBMS의 꽤 표준이고 꽤 표준입니다. 사람들은 항상 SQL에서 더 간결함을 원했던 것처럼 보입니다. 그러나보다 명확한 것은 종종 더 나은 결과를 산출하는 매우 자세한 언어입니다. – JNevill

+0

사실입니다. 나는 PostgreSQL에 의해 실제로 이런 명백한 것들을 쉽게 만들려고 노력합니다. :/ –

답변

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

이것이 오라클의 방식입니다. "더 간결하다": –

+1

"오라클"방식은 "바에서 1, 2에서 바즈로 선택"이 필요합니다. –

+1

맞습니다. 오라클은 심지어 간결합니다. -P –