SQL Select: использование CTE в качестве набора данных для предложения IN - синтаксическая ошибка - PullRequest
2 голосов
/ 21 апреля 2011

При реализации этой новой идеи Common Table Expressions в моем запросе:

SELECT ..... FROM .... WHERE ... IN 
(
 ;with CTEName as
   (
      CTE syntax goes here
   )
     SELECT .... FROM CTEName
)
GROUP BY ....

по-прежнему получаются следующие ошибки запроса:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ';'.
Msg 102, Level 15, State 1, Line 14
Incorrect syntax near ')'.

это действительное использование CTE?
Спасибо.

1 Ответ

5 голосов
/ 21 апреля 2011
WITH    CTEName as
        (
        -- CTE syntax goes here
        )
SELECT  *
FROM    mytable
WHERE   myfield IN 
        (
        SELECT  ctefield
        FROM    CTEName
        )
GROUP BY
        myotherfield

Другими словами, CTE должен быть определен перед всеми другими командами (как если бы они были фактическими таблицами).

Также обратите внимание, что точка с запятой (;) обычно не требуется,Однако синтаксис CTE был реализован в SQL Server после того, как он уже ввел ключевое слово WITH для своих собственных целей, поэтому неявное разбиение операторов больше не работает с CTE:

SELECT  *
FROM    mytable
WITH    q AS (SELECT 1)
SELECT  *
FROM    q

Трудно определить, где WITH используется в первом или втором выражении здесь.

Поэтому рекомендуется всегда ставить перед точкой WITH точку с запятой, чтобы ее можно было легко вырезать и вставить.в любом месте вашего кода, не беспокоясь о том, является ли это первым оператором в пакете или нет.

...