Det finns fall då du inte kan undvika en underfråga, till exempel om du måste inkludera beräknade kolumner som använder data från nuvarande och föregående rad. Tänk på den här frågan, till exempel:
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)
Det kommer att orsaka ett analysfel:
Jag hittade den här tråden på MSDN som har en lösning. Genom att ändra underfrågan så att den returnerar en uppsättning istället för ett skalärt värde, kunde jag spara och köra följande fråga.
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)