Dans certains cas, vous ne pouvez pas éviter une sous-requête, par exemple si vous devez inclure des colonnes calculées qui utilisent des données de la ligne actuelle et de la ligne précédente. Considérez cette requête, par exemple :
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)
Cela provoquera une erreur d'analyse :
J'ai trouvé ce fil sur MSDN qui a une solution de contournement. En modifiant la sous-requête afin qu'elle renvoie un ensemble au lieu d'une valeur scalaire, j'ai pu enregistrer et exécuter la requête suivante.
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)