2012-01-03 13 views
2

この同じcteクエリーに関する私の最後の質問はとても素早く答えられました。私はあなたがSQLの専門家からこの次のバウンスを返すと思いました。私の基本的なロジックを見て、私のコードと構文エラーを表示することができれば、どんな助けも大いに感謝されるでしょう。Sql Server CTE "マルチパート識別子をバインドできませんでした。"

私は株式取引システムのための3つのテーブルを持っています:毎日の価格設定/金額表:再び記載されているように、各レコードには日付フィールドと記号フィールドと価格情報と最後に取引日テーブルがあります:クエリ内のすべての取引日の参照。

私は、シンボルと日付の2つのフィールドを持つレコードセットを返したいと思います。その対は、価格ボリュームテーブル内のそのシンボルに対する対応する価格/体積データを有していないすべての取引日およびシンボルを表す。理にかなっている?私の質問では、私はエラーメッセージが表示されます: "マルチパート識別子" 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) 
) 

しかし、実際に、あなたはこのように、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からあなたの最後と次の使用可能な日付の間のすべての日付をつかみます。次にtblDailyPricingAndVolleft joinを入力し、一致する行を除外します。

あなたは、あまりにも、私は少し明確だと思うleft join、の代わりにnot existsを使用することができます。

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

+1

多くの歓迎、私が助けることができてうれしい:) – Eric

関連する問題