Это:
DatesNotNeeded AS
(
SELECT Date
FROM tblDailyPricingAndVol
WHERE (tblDailyPricingAndVol.Symbol = Symb.Symbol)
),
Должно быть так:
DatesNotNeeded AS
(
SELECT Date
FROM tblDailyPricingAndVol inner join Symb on
tblDailyPricingAndVol.Symbol = Symb.Symbol
),
Но ваш запрос все равно не будет работать, так как:
DatesNeeded AS
(
SELECT TradingDate
FROM WideDateRange wdr
WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded)
)
Требуетсябыть таким:
DatesNeeded AS
(
SELECT TradingDate
FROM WideDateRange wdr
WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded d where d.Date = wdr.TradingDate)
)
Но на самом деле вы можете сделать это без CTE, например:
select
sm.Symbol,
tb.TradingDate
from
tblSymbolsMain sm
cross join tblTradingDays tb
left join tblDailyPricingAndVol dp on
sm.Symbol = dp.Symbol
and tb.TradingDate = dp.Date
where
tb.TradingDate between
dbo.LatestAvailableDataDownloadDateTime()
and dbo.NextAvailableDataDownloadDatetime()
and dp.Date is null
Этот запрос собирает все символы из tblSymbolsMain
и все даты междуваши последние и следующие доступные даты от tblTradingDays
.Затем он делает left join
на tblDailyPricingAndVol
и отфильтровывает любую строку, которая нашла совпадение.
Вы также можете использовать not exists
вместо left join
, что, я думаю, немного яснее,тоже:
select
sm.Symbol,
tb.TradingDate
from
tblSymbolsMain sm
cross join tblTradingDays tb
where
tb.TradingDate between
dbo.LatestAvailableDataDownloadDateTime()
and dbo.NextAvailableDataDownloadDatetime()
and not exists (
select
1
from
tblDailyPricingAndVol dp
where
dp.Symbol = sm.Symbol
and dp.Date = tb.TradingDate
)