2012-01-04 108 views
1

这个问题是继续努力编写我的第一个cte,我在其他一些最近的帖子中提到过。简而言之,我正在为下面的查询编写一些编译器错误。我现在收到错误“Subquery返回了多个值,当子查询跟随=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。但是根据我目前的能力,我认为下面的内容对我来说似乎是“合法的”......任何帮助都会很棒。顺便说一句,我不是得到这个错误,或Visual Studio 2010中关闭,当我尝试运行此...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 

我的功能,要求:

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

您可以发布背后'NextAvailableDataDownloadDateTime'和'LatestAvailableDataDownloadDateTime'的代码? – Eric 2012-01-04 22:18:23

+0

@Eric Yup,刚才.. – StatsViaCsh 2012-01-04 22:23:14

+0

@StatsViaCash - 发现问题。你正在试图找到最大值的列。这将只返回'dateadd(hour,18,tradingdate) Eric 2012-01-04 22:28:22

回答

2

你的函数返回多个值。试试这个:

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 

和:

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 2012-01-04 22:38:38

-2

你再选择有选择*它返回所有列。子查询需要处理一列和行,即:
从汽车选择cartype其中cartype =“本田”

好运, speeves

+1

它存在于'不存在'中 - 这不是问题。您可以将多个列返回到“exists”。 – Eric 2012-01-04 22:17:49

+0

谢谢,埃里克!我一直在学习。我没有看到EXISTS:P – speeves 2012-01-05 03:27:18