簡體   English   中英

在CASE表達式的THEN內使用CTE時出現SQL錯誤

[英]SQL Error when using CTE inside THEN of CASE expression

編輯:

嘗試將其更改為以下內容(將CTE移至頂部)。

我現在得到錯誤:

關鍵字“ FROM”附近的語法不正確。

我嘗試在第二個“ THEN”子句中放置一個非常簡單的選擇,該子句甚至沒有使用cte,但我得到了相同的錯誤。 似乎不喜歡第二個子查詢呢?

 WITH MainCTE AS (
      SELECT DISTINCT rownum = ROW_NUMBER() OVER (
                  ORDER BY u.PLANNED_DATE
                               )
             ,u.name
             ,u.order
             ,u.unit_code
             ,u.mode
             ,u.[SEQUENCE]
             ,u.PLANNED_DATE
             ,City = left(SUBSTRING(name, CHARINDEX(':', name) + 1, CHARINDEX(',', name)), charindex(',', SUBSTRING(name, CHARINDEX(':', name) + 2, CHARINDEX(',', name))))
             ,StateAbbrv = SUBSTRING(SUBSTRING(name, CHARINDEX(':', name) + 1, LEN(name)), CHARINDEX(',', SUBSTRING(name, CHARINDEX(':', name) + 1, LEN(name))) + 1, 4)
       FROM TableU u
       INNER JOIN TableT T ON u.ordnum = t.ordnum
       INNER JOIN TableR R ON t.CustNum = r.CustNum
   )
SELECT DISTINCT o.first_name, 
o.last_name, 
o.phone_number
,CASE t.indicator
    WHEN 2
        THEN (
                SELECT mode
                FROM TableU
                WHERE TypeInd = 'I'
                    AND [DATE] = (
                        SELECT max([DATE])
                        FROM TableU
                        WHERE TypeInd = 'I'
                        )
                )
    WHEN 3
        THEN (
                SELECT DISTINCT maincte.mode AS plannedmode
                    ,maincte.PLANNED_DATE
                    ,maincte.[SEQUENCE]
                FROM maincte
                LEFT JOIN maincte prev ON prev.rownum = maincte.rownum - 1
                LEFT JOIN maincte nex ON nex.rownum = maincte.rownum + 1
                INNER JOIN TableT T ON u.ordnum = t.ordnum
                INNER JOIN TableR R ON t.CustNum = r.CustNum
                    AND maincte.[SEQUENCE] = r.[SEQUENCE]
                    AND t.[DATE] > '01/01/2014'
                ORDER BY maincte.[LOCAL_UNIT_SEQUENCE]
                    ,maincte.PLANNED_UNIT_DATE ASC
            ) 

FROM TableR R 
INNER JOIN TableT T ON t.CustNum = r.CustNum
INNER JOIN TableO O ON t.ordNum = o.OrdNum 
WHERE t.custNum = R.custNum
        AND o.custName = R.CustName
        AND t.indicator IN (
        2
        ,3
        )
        AND r.rstatus = 'Yes' 
ORDER BY t.ordnum

我下面的SQL語句無法運行,我很困惑如何解決它。 我只更改了列名和表名。

使用SQL Server 2008 Management Studio

我得到的錯誤是:

關鍵字“ WITH”附近的語法不正確。

關鍵字“ with”附近的語法不正確。 如果此語句是公用表表達式或xmlnamespaces子句,則前一條語句必須以分號終止。

')'附近的語法不正確。

SQL:

SELECT DISTINCT 
    o.first_name, 
    o.last_name, 
    o.phone_number
    ,CASE t.indicator
       WHEN 2
        THEN (SELECT mode
              FROM TableU
              WHERE TypeInd = 'I'
                AND [DATE] = (SELECT max([DATE])
                              FROM TableU
                              WHERE TypeInd = 'I')
             )
       WHEN 3
        THEN (WITH MainCTE AS (
                        SELECT DISTINCT rownum = ROW_NUMBER() OVER (
                                ORDER BY u.PLANNED_DATE
                                )
                            ,u.name
                            ,u.order
                            ,u.unit_code
                            ,u.mode
                            ,u.[SEQUENCE]
                            ,u.PLANNED_DATE
                            ,City = left(SUBSTRING(name, CHARINDEX(':', name) + 1, CHARINDEX(',', name)), charindex(',', SUBSTRING(name, CHARINDEX(':', name) + 2, CHARINDEX(',', name))))
                            ,StateAbbrv = SUBSTRING(SUBSTRING(name, CHARINDEX(':', name) + 1, LEN(name)), CHARINDEX(',', SUBSTRING(name, CHARINDEX(':', name) + 1, LEN(name))) + 1, 4)
                        FROM TableU u
                        INNER JOIN TableT T ON u.ordnum = t.ordnum
                        INNER JOIN TableR R ON t.CustNum = r.CustNum
                        )
                SELECT DISTINCT maincte.mode AS plannedmode
                    ,maincte.PLANNED_DATE
                    ,maincte.[SEQUENCE]
                FROM maincte
                LEFT JOIN maincte prev ON prev.rownum = maincte.rownum - 1
                LEFT JOIN maincte nex ON nex.rownum = maincte.rownum + 1
                INNER JOIN TableT T ON u.ordnum = t.ordnum
                INNER JOIN TableR R ON t.CustNum = r.CustNum
                    AND maincte.[SEQUENCE] = r.[SEQUENCE]
                    AND t.[DATE] > '01/01/2014'
                ORDER BY maincte.[LOCAL_UNIT_SEQUENCE]
                    ,maincte.PLANNED_UNIT_DATE ASC
            ) 
FROM 
   TableR R 
INNER JOIN 
   TableT T ON t.CustNum = r.CustNum
INNER JOIN 
   TableO O ON t.ordNum = o.OrdNum 
WHERE 
   t.custNum = R.custNum
   AND o.custName = R.CustName
   AND t.indicator IN (2, 3)
   AND r.rstatus = 'Yes' 
ORDER BY 
   t.ordnum

子查詢中不能包含CTE,但是如果在初始查詢之前移動CTE,則應該能夠在子查詢中訪問它。

在您進行編輯后,我仔細查看了您的查詢,發現了以下問題:

1)您在case語句的末尾缺少END 2)可以從case語句的子查詢中獲取多行3)您的第二個子查詢試圖返回3列

正如pyrrosa所說,您不能在子查詢中聲明CTE。 您必須在聲明的開頭聲明它。

WITH語句要求先前的語句以分號終止。 這就是為什么您經常在這樣的WITH語句之前經常看到分號的原因:

;WITH MainCTE AS...

我希望這可以解決錯誤:

關鍵字“ with”附近的語法不正確。 如果此語句是公用表表達式或xmlnamespaces子句,則前一條語句必須以分號終止。

添加分號后,您可能會得到不同的錯誤。 CASE語句中的子查詢不能返回多行; 它們必須返回單個標量值。 您查詢CTE的THEN語句應返回與當前行的值某種程度上相關的單個標量值。 當前,它可以返回多個值。

您的查詢給了我錯誤:

訊息1033,第15級,州1,第46行

除非還指定了TOP或FOR XML,否則ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效。

這是因為您不能在THEN子句中使用ORDER BY ,因為它只能返回單個標量值。

同樣,在一種情況下不能返回多列,而在另一種情況下不能返回單列。 如果您嘗試返回多個列,則會出現此錯誤(在SQL Server 2008 R2上):

消息116,第16層,狀態1,第6行

如果未使用EXISTS引入子查詢,則只能在選擇列表中指定一個表達式。

您可能需要2個不同查詢的UNION ,但是UNION必須返回相同數量的列。 如果那對您不起作用,也許您可​​以使用單獨的查詢返回不同的表。

我發現您的熱門查詢有兩個問題。

  1. 您在案例陳述中缺少END 這就是為什么您Incorrect syntax near the keyword 'FROM'.得到Incorrect syntax near the keyword 'FROM'.的原因Incorrect syntax near the keyword 'FROM'. 錯誤。

  2. 您不能在子查詢中下訂單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM