L'identificateur multi-parties Sql Server CTE "n'a pas pu être lié".

Ma dernière question sur cette même requête de cte a été répondue si rapidement, j'ai pensé que je rebondirais la prochaine sur vos gourous sql. Si je pouvais passer en revue ma logique de base, puis montrer mon code et mon erreur de syntaxe, toute aide serait grandement appréciée.

J'ai trois tables pour un système d'échange d'actions: une table de symboles: comme son nom l'indique, il s'agit d'une list de symboles boursiers, un tableau de prix / volume journalier: encore une fois, comme décrit, chaque champ contient un champ de date et un symbole comme les informations de prix, et enfin un tableau de dates de trading: la reference pour toutes les dates de trading dans notre requête.

Je voudrais returnner un jeu d'loggings avec deux champs: un symbole et une date. La paire représente toutes les dates de négociation et les symboles qui n'ont pas de données de prix / vol correspondantes pour ce symbole dans la table de volume de prix. Avoir du sens? Sur ma requête, j'obtiens le message d'erreur: "L'identificateur en plusieurs parties" Symb.Symbol "ne peut pas être lié." Voici ma requête 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 

Ce:

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

Doit être ceci:

 DatesNotNeeded AS ( SELECT Date FROM tblDailyPricingAndVol inner join Symb on tblDailyPricingAndVol.Symbol = Symb.Symbol ), 

Mais votre requête ne fonctionnera toujours pas, puisque ceci:

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

Doit être ceci:

 DatesNeeded AS ( SELECT TradingDate FROM WideDateRange wdr WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded d where d.Date = wdr.TradingDate) ) 

Mais vraiment, vous pouvez le faire sans CTE, comme ceci:

 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 

Cette requête récupère tous les symboles de tblSymbolsMain et toutes les dates entre votre dernière et prochaine date disponible dans tblTradingDays . Ensuite, il fait une left join sur tblDailyPricingAndVol et filter toute ligne qui a trouvé une correspondance.

Vous pouvez également utiliser not exists à la place d'une left join , ce qui est un peu plus clair, je pense:

 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 )