Na jakimś stole testowym mój pierwotny plan wygląda następująco.
Po prostu oblicza wynik raz i buforuje go w sppol, a następnie odtwarza ten wynik. Możesz spróbować wykonać następujące czynności, aby SQL Server widział podzapytanie jako skorelowane i wymagające ponownej oceny dla każdego zewnętrznego wiersza.
UPDATE table1
SET table2Id = (SELECT TOP 1 table2Id
FROM table2
ORDER BY Newid(),
table1.table1Id)
Dla mnie to daje ten plan bez szpuli.
Ważne jest, aby korelować z unikalnym polem z table1
jednak tak, że nawet jeśli szpula zostanie dodana, zawsze musi być odbita, a nie przewijana (odtwarzając ostatni wynik), ponieważ wartość korelacji będzie inna dla każdego wiersza.
Jeśli tabele sąduże będzie to powolne ponieważ wymagana praca jest iloczynem dwóch wierszy tabeli (dla każdego wiersza w table1
musi wykonać pełne skanowanie table2
)