[英]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必須返回相同數量的列。 如果那對您不起作用,也許您可以使用單獨的查詢返回不同的表。
我發現您的熱門查詢有兩個問題。
您在案例陳述中缺少END
。 這就是為什么您Incorrect syntax near the keyword 'FROM'.
得到Incorrect syntax near the keyword 'FROM'.
的原因Incorrect syntax near the keyword 'FROM'.
錯誤。
您不能在子查詢中下訂單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.