Удалить подзапрос из JOIN? - PullRequest
       13

Удалить подзапрос из JOIN?

2 голосов
/ 27 сентября 2011

В следующем запросе я хотел бы удалить подзапрос из оператора JOIN (поскольку мои два оператора SELECT выбирают данные из одной таблицы). Как я могу использовать этот псевдоним? Заранее благодарю за любую помощь.

declare @StartDate datetime= '8/01/2011'
declare @EndDate datetime = '9/20/2011'
declare @PortfolioId int = 6

SELECT
   Previous.PreviousNAV,
   Todays.TodaysNAV,
   ISNULL((Todays.TodaysNAV-Previous.PreviousNAV),0) NetChange,
   ISNULL((Todays.TodaysNAV-Previous.PreviousNAV) / Todays.TodaysNAV,0) BAMLIndex
FROM
(
   SELECT PortfolioId,ISNULL(NAV,0) PreviousNAV
   FROM Fireball..NAV
   WHERE Date BETWEEN @StartDate AND @EndDate and PortfolioId = @PortfolioId
) Previous
JOIN
(
   SELECT PortfolioId,ISNULL(NAV,0) TodaysNAV
   FROM Fireball..NAV
   WHERE Date = @EndDate and PortfolioId = @PortfolioId
) Todays
ON Previous.PortfolioId = Todays.PortfolioId

1 Ответ

2 голосов
/ 27 сентября 2011

Просто полностью исключите подзапросы.Я не думаю, что они добавляют что-либо к запросу.Попробуйте вместо этого:

SELECT
   Previous.NAV as PreviousNAV,
   Todays.NAV as TodaysNav,
   ISNULL((Todays.NAV-Previous.NAV),0) NetChange,
   ISNULL((Todays.NAV-Previous.NAV) / Todays.NAV,0) BAMLIndex
FROM
    Fireball..NAV as Previous
JOIN
    Fireball..NAV as Todays
    ON Previous.portfolioID = Todays.PortfolioID
WHERE Previous.Date BETWEEN @StartDate AND @EndDate 
    AND Previous.PortfolioId = @PortfolioId
    AND Todays.Date = @EndDate
...