Ich habe zwei CTEs, der erste führt ein 'Select Top N', um eine Probe von Datensätzen zu erhalten, dann teilt die zweite jede Aufzeichnung, die 2 Zeilen für jeden Datensatz produziert.Warum wird CTE zweimal ausgeführt?
Ich habe mit gefälschten Daten reproduziert, mit newid(), um die Sortierreihenfolge der Probe zu bestimmen.
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
Das erwartete Ergebnis ist zwei Zeilen für jede Eingabezeile ist so etwas wie:
Pos Id Col
0 720 A719
1 720 A719
Allerdings habe ich bekommen, was ist so etwas wie
Pos Id Col
0 720 A719
1 774 B773
So die "top 1" in CTE scheint zweimal in der CTE2 ausgeführt werden.
Ist das normal? Kann mir jemand auf irgendeine Dokumentation hinweisen, die dieses Verhalten erklären kann?
weil der CTE Sie die Auswahl sind splitrecs ist, die alle eine UNION hat so dauert es eine Top 1 dann Gewerkschaften anohter Top 1 und Sie erhalten 2 Ergebnisse – Matt