2012-01-03 30 views
2

我對這個同樣的cte查詢的最後一個問題很快就回答了,我想我會反彈你的下一個sql大師。如果我可以通過我的基本邏輯,然後顯示我的代碼和語法錯誤,任何幫助將不勝感激..Sql Server CTE「多部分標識符無法綁定」。

我有三個股票交易系統表:一個符號表:顧名思義,它是一個列表的股票代碼,每日定價/成交量表:同樣如上所述,每條記錄都有一個日期字段和符號字段以及定價信息,最後是交易日期表:我們查詢中所有交易日期的參考。

我想返回一個記錄集有兩個字段:一個符號和一個日期。該對代表所有交易日期和符號,在定價量表中沒有該符號的相應定價/交易量數據。合理?在我的查詢中,我收到錯誤消息:「多部分標識符」Symb.Symbol「無法綁定。」這裏是我的CTE查詢:

WITH Symb AS 
(
    SELECT Symbol 
    FROM tblSymbolsMain 
), 

DatesNotNeeded AS 
(
    SELECT Date 
    FROM tblDailyPricingAndVol 
    WHERE (tblDailyPricingAndVol.Symbol = Symb.Symbol) 
), 

WideDateRange AS 
(
    SELECT TradingDate 
    FROM tblTradingDays 
    WHERE (TradingDate >= dbo.NextAvailableDataDownloadDateTime()) AND (TradingDate <= dbo.LatestAvailableDataDownloadDateTime()) 
), 

DatesNeeded AS 
(
    SELECT TradingDate 
    FROM WideDateRange wdr 
    WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded) 
) 

SELECT Symb.Symbol, DatesNeeded.TradingDate 
FROM Symb CROSS JOIN DatesNeeded 

回答

9

此:

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) 
) 

不過說真的,你能做到這一點沒有熱膨脹係數,是這樣的:

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你最後一次和下一個可用日期之間的日期。然後它在tblDailyPricingAndVol上執行left join並過濾掉找到匹配的任何行。

你也可以使用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 
    ) 
+0

哇。非常感謝。 – StatsViaCsh 2012-01-03 23:39:16

+1

許多歡迎,很高興我可以幫助:) – Eric 2012-01-03 23:39:54

相關問題