2017-03-18 1 views
2

저는 이전에 SQL 서버에 들어 본 적이없는 것의 골칫거리입니다.한 열의 쿼리 값 결과

이 쿼리 :

SELECT N FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) T(N) 

날 결과를 제공합니다

+---+ 
| N | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

규칙이 여기에 무엇입니까? 분명히 이것은 모든 값을 하나의 열에 정렬하는 것입니다. T(N)으로 이것을 정의하는 SQL Server의 문법은 무엇입니까?

다른 측면에서

,이 쿼리는 별도의 컬럼으로 결과를 제공합니다 :

select 0,1,2,3,4,5,6,7,8,9 
첫 번째 쿼리의 결과는 하나 개의 컬럼에 모든 정렬 왜

난 그냥 이해가 안 돼요?

+0

잘 보입니다 ^.^ – SqlZim

+0

사실 :) 여기에서 CTE 마법을 연구 중입니다. http://stackoverflow.com/a/42797191/867703 – FrenkyB

답변

1

제임스 Z 바로 돈이지만, 대답은 참조 된에 무엇에 확장 :에서 가져온되는 코드에서

, 그 부분은 stacked cte에 대한 번호 테이블을 시작하는 데 사용됩니다. 숫자 자체는 중요하지 않지만 나는 그런 식으로 좋아합니다. 그것들은 모두 1 또는 0이 될 수 있습니다.이 인스턴스에서 사용되는 방식은 변경되지 않습니다.

기본적으로 우리는 10 개의 행을 가지고 있으며, 그 다음에는 우리가 필요로하는 것 이상까지 행 수를 늘리기 위해 자기 자신을 N 번으로 십자가에 연결할 것입니다. cross join 별칭 n에서 행 deka의 결과 값은 10, hecto은 100, kilo은 1,000 등입니다.

declare @fromdate date = '20000101'; 
declare @years int = 30; 
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, dates as (
    select top (datediff(day, @fromdate,dateadd(year,@years,@fromdate))) 
     [Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate)) 
    from n as deka cross join n as hecto cross join n as kilo 
       cross join n as tenK cross join n as hundredK 
    order by [Date] 
) 
select [Date] 
from dates; 

stacked cte가 수행 할 실제 numbers 또는 calendar 테이블을 사용하지만, 생성 또는 숫자 나 날짜 테이블을 시뮬레이션 매우 효율적입니다 : 여기

는 참조 된 함수의 외부 비슷한 쿼리입니다 규모가 커질수록 좋습니다. 관련 벤치 마크

확인이 아웃 : HIST 기사에서

아론 버트 랜드는 사용 cte을 쌓아 만들어

;WITH e1(n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), 
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), 
.... 
3

값 절은 insert 문에서 사용할 수있는 것과 유사하며 Table Value Constructor이라고합니다. 예제에는 하나의 열과 여러 행만 있지만 여러 열을 쉼표로 구분하여 표시 할 수도 있습니다. T (N)은 테이블의 별명 이름 (T)과 컬럼 이름 (N)을 정의합니다.

관련 문제