두 개의 CTE가 있습니다. 첫 번째 레코드는 'select top n'을 실행하여 레코드 샘플을 얻은 다음 두 번째 레코드는 각 레코드에 대해 2 개의 행을 생성합니다.CTE가 두 번 선택을 실행하는 이유는 무엇입니까?
샘플의 정렬 순서를 결정하기 위해 newid()를 사용하여 가짜 데이터로 재생했습니다.
Pos Id Col
0 720 A719
1 720 A719
그러나, 내가 무엇을 얻을 것은
Pos Id Col
0 720 A719
1 774 B773
그래서
은 "상위 1"같은 것이 있습니다 :
declare @testtab table (Id bigint identity (1,1), ColA varchar(10), ColB varchar(10))
-- generate 1000 sample records
declare @cnt int = 0
while (@cnt<1000)
begin
insert @testtab(ColA, ColB) values ('A'+convert(varchar,@cnt), 'B'+convert(varchar,@cnt))
set @cnt+=1
end
;with SampleRecs as(
select top 1 * from @testtab order by newid()
)
,SplitRecs as (
select 0 Pos,Id,ColA Col from SampleRecs
union all
select 1, id, ColB col from SampleRecs
)
select * from SplitRecs
order by id, pos
예상되는 최종 결과는 각 입력 행에 대해 2 개 행이는 같은 것입니다 CTE 2에서 CTE가 두 번 실행되는 것 같습니다.
정상입니까? 누구든지이 동작을 설명 할 수있는 문서를 가리킬 수 있습니까?
:
하면 기대하고있는 결과를 얻으려면, 당신은 다음 대신하는이
CROSS JOIN
가Pos
값을 시드 활용 할 수 그래서 상위 1 위를 차지하고 상위 1 위를 노조하고 2 개의 결과를 얻습니다. – Matt