I zostały debugowanie oświadczenie poniżej godzinami:Dziwne zachowanie SQL Server - losowy wybór
SELECT
(
SELECT t1.anotherColumn
FROM table1 t1
WHERE t1.aColumn=(1+ABS(Checksum(NewId()))%54)
) res, *
FROM
(
SELECT TOP 200 * --PLEASE NOTICE HERE
FROM table2
)RESULT
i problem jest to, że zawsze res
zawiera taką samą wartość dla każdego wiersza. Teraz, jeśli zmienię 200
, która jest podświetlona w instrukcji zapytania do dowolnej liczby poniżej 176
, pokazuje losowe wiersze table1
, co jest pożądanym wynikiem!
Należy pamiętać, że 54
nie ma wpływu na wyniki i jest tam tylko dlatego, że moja tabela ma 54 różnych wartości od 1 do 54 dla aColumn
.
Próbowałem tego zapytania na różnych tabelach i to dziwne zachowanie się powtarza!
To brzmi jak może działać optymalizator zapytań. –
@TimBiegeleisen To szwy, że SQL Server robi coś za kulisami, i być może to jest optymalizator zapytań, nie jestem pewien, chyba że wiesz jakoś. BTW, powinien istnieć sposób, by podziękować, proszę, nie rób tego dla mnie! – mok
Być może trzeba będzie wymusić na silniku wykonanie pierwszego podzapytania dla każdego wiersza wyników. Spróbuj dodać obojętny warunek w pierwszym podzapytaniu, który sprawia, że jest to zapytanie korelacyjne, coś takiego jak "AND result.id nie jest puste". – trincot