sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:række til stede i én forespørgsel, mangler i en anden

Demonstration af mulig forklaring.

Opret tabelscript

SELECT *
INTO #T
 FROM master.dbo.spt_values

 CREATE NONCLUSTERED INDEX [IX_T] ON  #T ([name] DESC,[number] DESC);

Forespørgsel 1 (Giver 35 resultater)

WITH cte AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
 FROM  #T
)
SELECT c1.number,c1.[type] 
FROM cte c1
JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number

Forespørgsel 2 (Samme som før, men tilføjelse af c2.[type] til den valgte liste giver 0 resultater);

WITH cte AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
 FROM  #T
)
SELECT c1.number,c1.[type] ,c2.[type] 
FROM cte c1
JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number

Hvorfor?

row_number() for duplikerede NAVNE er ikke angivet, så den vælger bare den, der passer ind i den bedste udførelsesplan for de påkrævede outputkolonner. I den anden forespørgsel er dette det samme for begge cte-ankaldelser, i den første vælger den en anden adgangssti med resulterende forskellig rækkenummerering.

Foreslået løsning

Du melder dig selv til CTE på ROW_NUMBER() over (order by t.[Date])

I modsætning til hvad der kunne have været forventet, vil CTE sandsynligvis ikke realiseres hvilket ville have sikret ensartethed for selvforeningen og dermed antager du en korrelation mellem ROW_NUMBER() på begge sider, der muligvis ikke eksisterer for poster, hvor en dublet [Date] findes i dataene.

Hvad hvis du prøver ROW_NUMBER() over (order by t.[Date], t.[id]) for at sikre, at i tilfælde af uafgjorte datoer, er rækkenummereringen i en garanteret ensartet rækkefølge. (Eller en anden kolonne/kombination af kolonner, der kan differentiere poster, hvis id ikke vil gøre det)



  1. Sådan får du tilfældige rækker fra SQL Server Table - SQL Server / TSQL Tutorial Del 117

  2. Golang Indsæt NULL i sql i stedet for tom streng

  3. Ugyldig standardværdi for 'dateAdded'

  4. Hvorfor bliver MySQL InnoDB indsættelser / opdateringer på store tabeller meget langsomme, når der er nogle få indekser?