SQL Server 2008 ошибка просмотра с оператором case - PullRequest
1 голос
/ 22 ноября 2011

Я не могу понять, почему этот код выполняется как запрос, но когда я выполняю его в представлении, он выдает многоэлементный идентификатор, который не может быть связан, ошибка.

Когда я вынимаю оператор case, он работает в представлении, поэтому я считаю, что это как-то связано с оператором case.

Любые предложения приветствуются.

WITH [cteFrostSum] AS
(
    SELECT ID AS ID, theMonth  as Mo,
    SUM(dbo.Frost.[DRAmount])  AS [DRAmount]
    FROM dbo.Frost 
    GROUP BY [ID], theMonth
) 
SELECT DISTINCT 
    TOP (100) PERCENT      
    dbo.ternean.MemberID, 
    dbo.ternean.SSN, 
    dbo.ternean.GroupName, 
    dbo.ternean.CustomerID, 
    dbo.ternean.GroupNumber, 
    dbo.ternean.LastName, 
    dbo.Frost.DRAmount, 
    dbo.Frost.HittheBank, 
    dbo.Frost.MonthofPremium, 
    cte.[DRAmount] AS [SUM_Frost_Balance],
    dbo.ternean.TotalCost,
    cte.[DRAmount] - dbo.ternean.TotalCost AS Diff,
    dbo.ternean.ACH_RoutingNo, 
    dbo.Frost.RTNum, 
    dbo.ternean.ACH_AcctNo,
    dbo.Frost.AccountNumber, 

    CASE
        WHEN dbo.Frost.RTNum <> SUBSTRING(dbo.ternean.ACH_RoutingNo, 2, 20)
            THEN 'DO not match'
        WHEN dbo.Frost.RTNum = SUBSTRING(dbo.ternean.ACH_RoutingNo, 2, 20)
            THEN 'match'
    END AS [Routing # match], 
    CASE
        WHEN SUBSTRING(dbo.ternean.ACH_AcctNo, 2, 20) <> dbo.Frost.AccountNumber
            THEN 'DO not match'
        WHEN SUBSTRING(dbo.ternean.ACH_AcctNo, 2, 20) = dbo.Frost.AccountNumber
            THEN 'match'
    END AS [Account # match],
    dbo.Frost.theMonth
FROM dbo.Frost
INNER JOIN dbo.ternean ON dbo.Frost.ID = dbo.ternean.CustomerID
    AND dbo.Frost.theMonth = dbo.ternean.theMonth 
INNER JOIN [cteFrostSum] cte ON dbo.Frost.ID = cte.ID
    AND dbo.Frost.theMonth = cte.Mo
ORDER BY dbo.ternean.theMonth

1 Ответ

2 голосов
/ 24 ноября 2011

Я пытался повторить вашу ошибку, но не смог.

Почему вы все равно используете многочастные идентификаторы имен полей?Список полей в операторе select может ссылаться только на таблицы в предложении from, при первом чтении этот запрос, кажется, ссылается на таблицы непосредственно в схеме dbo.

Дайте вашим таблицам несколько хороших простых псевдонимов, например

FROM dbo.Frost AS F

, и используйте их следующим образом

F.RTNum

Во-вторых, вы можете упростить свои выражения case и выполнить только один тест, т.е.:

CASE WHEN SUBSTRING(T.ACH_AcctNo, 2, 20) <> F.AccountNumber
    THEN 'DO not match'
    ELSE 'match'
END AS [Account # match]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...