2012-01-04 13 views
1

この質問は、他の最近の2つの記事で私が言及した最初のcteをコード化するのと同じ努力の続きです。一言で言えば、私は以下のクエリのためのいくつかのコンパイラエラーを処理しています。 Subqueryが複数の値を返したというエラーが表示されます。サブクエリの後に=、!=、<、< =、>、> =、またはサブクエリが式として使用されているときには許可されません。しかし、私が下に出てきたことは、私の現在の能力に基づいて私に "合法"と思われる...どんな助けも素晴らしいだろう。要求されるようにところで、...Sql Server cteエラー "サブクエリが複数の値を返しました。"

WITH Symb AS 
(
    SELECT Symbol 
    FROM tblSymbolsMain 
), 

DatesNotNeeded AS 
(
    SELECT Date 
    FROM tblDailyPricingAndVol inner join Symb on 
     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 d where d.Date = wdr.TradingDate) 
) 

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

そして、私の機能を私はどちらかは、そのエラーを取得するか、私はこれを実行しようとすると、Visual Studio 2010はシャットダウンします

ALTER FUNCTION dbo.LatestAvailableDataDownloadDateTime() 
    RETURNS date 
BEGIN 
    RETURN (SELECT DATEADD(hour, 18, MAX(TradingDate)) AS LatestTradingDateAvailForDL 
    FROM tblTradingDays 
    GROUP BY TradingDate 
    HAVING (DATEADD(hour, 18, MAX(TradingDate)) < GETDATE())) 
END 

ALTER FUNCTION dbo.NextAvailableDataDownloadDateTime() 
    RETURNS date 
BEGIN 
    RETURN (SELECT DATEADD(hour, 18, MIN(TradingDate)) AS TrDate 
    FROM tblTradingDays 
    HAVING (DATEADD(hour, 18, MIN(TradingDate)) > dbo.LatestDataDownloadDate())) 
END 
+0

ALTER FUNCTION dbo.LatestAvailableDataDownloadDateTime() RETURNS date BEGIN RETURN (SELECT DATEADD(hour, 18, MAX(TradingDate)) AS LatestTradingDateAvailForDL FROM tblTradingDays WHERE (DATEADD(hour, 18, TradingDate) < GETDATE())) END 

そして、これを試してみてください? – Eric

+0

@Eric Yup、ちょうど行った.. – StatsViaCsh

+0

@StatsViaCash - 問題が見つかりました。あなたは、あなたが最大のものを見つけようとしている列でグループ分けしています。これは、 'dateadd(hour、18、tradingdate) Eric

答えて

2

あなたの機能は、複数の値を返すされている車から
選択cartype:副問い合わせは1列と行、すなわちに対処する必要があります。あなたは `NextAvailableDataDownloadDateTime`と` LatestAvailableDataDownloadDateTime`背後にあるコードを投稿することができ

ALTER FUNCTION dbo.NextAvailableDataDownloadDateTime() 
    RETURNS date 
BEGIN 
    RETURN (SELECT DATEADD(hour, 18, MIN(TradingDate)) AS TrDate 
    FROM tblTradingDays 
    WHERE (DATEADD(hour, 18, TradingDate) > dbo.LatestDataDownloadDate())) 
END 
+0

最初のカップルのパスでは、私たちはビジネスにいると思います。 :)私は現在のSQL Serverの本のために私の現在の読書を今夜交換しています。どうも。 – StatsViaCsh

-2

あなたの副選択は、select *を持っています、すべての列を返します。 cartype = 'ホンダ

幸運、 speeves

+1

これは'存在しません 'にあります - これは問題ではありません。複数のカラムを 'exists'に返すことができます。 – Eric

+0

ありがとう、エリック!私はいつも学んでいます。私は存在を捕まえていませんでした:P – speeves

関連する問題