【问题标题】:Syntax for CTE in Microsoft SQL Server Management StudioMicrosoft SQL Server Management Studio 中 CTE 的语法
【发布时间】:2019-03-29 23:05:19
【问题描述】:
;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 函数上苦苦挣扎。

【问题讨论】:

标签: sql-server


【解决方案1】:

您缺少使用 CTE 的 SELECT(或 UPDATE、DELETE 或 INSERT)。声明不会在语句中使用的 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 的开头。

【讨论】:

  • 路易斯你好,很抱歉问这个问题。但我正在阅读 CTE。我浪费了一天的时间来解决这个问题。你能告诉我选择语句应该来自哪里吗?你是说CTE之后?请帮忙。
  • 我编辑了我的答案,以提供有关可以做什么的更多指示。
  • @KaustubhUrsekar 你怎么可能在这个问题上浪费一天的时间?您应该从阅读文档开始。
  • 非常感谢 Luis 的编辑和解释。感谢您的时间兄弟! :)
  • 谢谢马丁。我正在尝试这样做,但对这个领域很陌生。我很难把握事情。欢迎任何意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2013-09-14
  • 2021-06-05
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多