Има случаи, когато не можете да избегнете подзаявка, например ако трябва да включите изчислени колони, които използват данни от текущия и предишния ред. Разгледайте например тази заявка:
SELECT
(Current.Mileage - Last.Mileage)/Quantity as MPG
FROM
GasPurchases AS Current
LEFT OUTER JOIN GasPurchases AS Last
ON Last.Date =
(SELECT MAX(PurchaseDate)
FROM GasPurchases
WHERE PurchaseDate < Current.PurchaseDate)
Това ще доведе до грешка при анализиране:
Намерих тази тема в MSDN, който има заобиколно решение. Чрез промяна на подзаявката, така че да връща набор вместо скаларна стойност, успях да запазя и изпълня следната заявка.
SELECT
(Current.Mileage - Last.Mileage)/Quantity as MPG
FROM
GasPurchases AS Current
LEFT OUTER JOIN GasPurchases AS Last
ON Last.Date IN
(SELECT MAX(PurchaseDate)
FROM GasPurchases
WHERE PurchaseDate < Current.PurchaseDate)