2012-01-03 2 views
2

이 동일한 cte 쿼리에 대한 나의 마지막 질문은 너무 빨리 대답되었으므로 나는이 다음 질문을 당신의 SQL 전문가에게 알려줄 것이라고 생각했습니다. 내 기본 논리를 살펴볼 수 있다면 내 코드와 구문 오류를 보여줄 수 있습니다. 어떤 도움을 주시면 대단히 감사하겠습니다.SQL Server CTE "다중 부분 식별자를 바인딩 할 수 없습니다."

나는 주식 거래 시스템을 위해 3 개의 테이블을 가지고 있습니다. 기호 테이블 : 이름이 제안하는 것처럼 시세 기호, 일별 가격 책정/볼륨 테이블 : 다시 설명 된대로 각 레코드는 가격 필드와 날짜 필드 및 기호 필드를 포함하며 마지막으로 거래 날짜 테이블 : 쿼리의 모든 거래 날짜에 대한 참조 .

두 개의 필드가있는 레코드 세트를 반환하고 싶습니다. 심볼과 날짜입니다. 이 쌍은 모든 거래일과 가격 기호 표에 해당 기호에 해당하는 가격/가격 데이터가없는 기호를 나타냅니다. 이해가 되니? 내 쿼리에서 오류 메시지가 나타납니다 : "다중 부분 식별자"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 inner join Symb on 
     tblDailyPricingAndVol.Symbol = Symb.Symbol 
), 

그러나 쿼리는 여전히이 때문에 작동하지 않습니다 :

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

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

요구는이 일하기

필요가 있습니다.

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에서 마지막과 가능한 다음 날짜 사이의 모든 날짜를 잡고. 그런 다음 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

관련 문제