Ci sono casi in cui non puoi evitare una sottoquery, ad esempio se devi includere colonne calcolate che utilizzano i dati della riga corrente e precedente. Considera questa query, ad esempio:
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)
Causerà un errore di analisi:
Ho trovato questo thread su MSDN che ha una soluzione alternativa. Modificando la sottoquery in modo che restituisca un set invece di un valore scalare, sono stato in grado di salvare ed eseguire la query seguente.
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)