Zdarzają się sytuacje, w których nie można uniknąć podzapytania, na przykład jeśli musisz uwzględnić kolumny obliczeniowe, które używają danych z bieżącego i poprzedniego wiersza. Rozważ to zapytanie, na przykład:
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)
Spowoduje to błąd parsowania:
Znalazłem ten wątek w witrynie MSDN, która zawiera obejście. Zmieniając podzapytanie tak, aby zwracało zestaw zamiast wartości skalarnej, mogłem zapisać i uruchomić następujące zapytanie.
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)