Синтаксис для CTE в Microsoft SQL Server Management Studio - PullRequest
0 голосов
/ 29 марта 2019
;WITH 
cte_REFERRALS_REPORTS (referralnum, refer_from, refer_from_name, refer_from_id, refer_to, refer_to_name, refer_to_id)
AS
    (
    SELECT 
        referralnum, refer_from,
        CASE
                WHEN refer_from_id = 'R'    THEN RdicF.refname 
                WHEN refer_from_id = 'P'    THEN PdicF.provname END AS refer_from_name,
        refer_from_id, refer_to, 
        CASE
                WHEN refer_to_id = 'R'      THEN RdicT.refname
                WHEN refer_to_id = 'P'      THEN PdicT.provname END AS refer_to_name,
        refer_to_id
    FROM 
        referral_t r
    LEFT JOIN 
        refcode_t RdicF
    ON  r.refer_from = CASE WHEN r.refer_from_id='R' THEN RdicF.refcode ELSE NULL END
    LEFT JOIN 
        refcode_t RdicT
    ON  r.refer_to = CASE WHEN r.refer_to_id = 'R' THEN RdicT.refcode ELSE NULL END
    LEFT JOIN
        provcode_t PdicF
    ON r.refer_from  = CASE WHEN r.refer_from_id = 'P' THEN PdicF.provcode ELSE NULL END
    LEFT JOIN
        provcode_t PdicT
    ON r.refer_to = CASE WHEN r.refer_to_id = 'P' THEN PdicT.provcode ELSE NULL END
    )

Мой запрос внутри CTE работает, но я чувствую, что синтаксис неправильный. Я получаю эту ошибку:

"Неверный синтаксис рядом с ')'"

Пожалуйста, помогите. Я новичок в SQL и кодирования. Я борюсь с функциями CTE и Window.

1 Ответ

4 голосов
/ 29 марта 2019

Вам не хватает SELECT (или UPDATE, DELETE или INSERT), который использует CTE. Нет смысла объявлять CTE, который не будет использоваться в выражении.

WITH 
cte_REFERRALS_REPORTS (referralnum, refer_from, refer_from_name, refer_from_id, refer_to, refer_to_name, refer_to_id)
AS
    (
    SELECT 
        referralnum, refer_from,
        ISNULL( RdicF.refname, PdicF.provname) END AS refer_from_name, --Code shortened, but you could keep the original for clarity.
        refer_from_id, refer_to, 
        CASE
                WHEN refer_to_id = 'R'      THEN RdicT.refname
                WHEN refer_to_id = 'P'      THEN PdicT.provname END AS refer_to_name,
        refer_to_id
    FROM      referral_t r
    LEFT JOIN refcode_t RdicF ON  r.refer_from = RdicF.refcode  AND r.refer_from_id = 'R'
    LEFT JOIN refcode_t RdicT ON  r.refer_to   = RdicT.refcode  AND r.refer_to_id = 'R'
    LEFT JOIN provcode_t PdicF ON r.refer_from = PdicF.provcode AND r.refer_from_id = 'P'
    LEFT JOIN provcode_t PdicT ON r.refer_to   = PdicT.provcode AND r.refer_to_id = 'P'
    )
SELECT *
FROM cte_REFERRALS_REPORTS;

Я внес некоторые изменения в ваш код, которые могут помочь разработчикам и оптимизатору понять, что происходит на этих JOINS. Вам также нужно понимать, что точка с запятой (;) является терминатором оператора и должна находиться в конце каждого оператора, а не в начале CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...