【发布时间】:2014-08-14 14:48:27
【问题描述】:
编辑:
尝试将其更改为以下(将 CTE 移到顶部)。
我现在得到错误:
关键字“FROM”附近的语法不正确。
我尝试在甚至没有使用 cte 的第二个“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 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
【问题讨论】:
-
with语句位于主select之前。这是 SQL Server 中 CTE 的语法。但是您的查询有多个问题。例如,看起来子查询将在需要标量子查询的上下文中返回多行和多列。 -
您的 with 子句带来了多个列,这对于您的语句中的 case (then) 运算符无效。它应该在 select 语句中只带一列,只返回一行。
-
不应该先运行where子句吗?这会将其缩小到选择将使用的一行值
-
即使我选择了top 1,也没有办法在THEN子句中加入CTE?
-
您经常会看到
;WITH,其中出现了前导分号,以保证之前的任何语句都已终止。
标签: sql sql-server common-table-expression correlated-subquery case-statement