Sql Server cte error «Подзапрос вернул более одного значения». - PullRequest
1 голос
/ 05 января 2012

Этот вопрос является продолжением тех же усилий, что и мой первый код, который я упоминал в нескольких других недавних постах. Короче говоря, я работаю через пару ошибок компилятора для запроса ниже. Теперь я получаю сообщение об ошибке: «Подзапрос вернул более одного значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения» Но то, что я придумаю ниже, мне кажется «законным», исходя из моих нынешних способностей ... любая помощь будет отличной. Кстати, я либо получаю эту ошибку, либо Visual Studio 2010 закрывается, когда я пытаюсь запустить это ...

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

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Ваши функции возвращают более одного значения. Попробуйте это:

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 голосов
/ 05 января 2012

Ваш подвыбор имеет выбор *, который возвращает все столбцы. Подвыборы должны иметь дело с одним столбцом и строкой, т.е.:
выберите тип машины из автомобилей, где Cartype = 'Honda'

удачи, speeves

...