Há casos em que você não pode evitar uma subconsulta, por exemplo, se tiver que incluir colunas calculadas que usam dados da linha atual e da linha anterior. Considere esta consulta, por exemplo:
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)
Isso causará um erro de análise:
Encontrei este tópico no MSDN que tem uma solução alternativa. Ao alterar a subconsulta para que ela retorne um conjunto em vez de um valor escalar, consegui salvar e executar a consulta a seguir.
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)