T-sql Запрос общего выражения как подзапрос - PullRequest
1 голос
/ 31 марта 2010

У меня следующий запрос:

    WITH Orders(Id)
AS (
SELECT DISTINCT anfrageid FROM MPHotlineAnfrageAnhang
)
SELECT Id,
(
SELECT CONVERT(VARCHAR(255),anfragetext) + ' | '
FROM MPHotlineAnfrageAnhang
WHERE anfrageid = Id
ORDER BY anfrageid, erstelltam
FOR XML PATH('')
) AS Descriptions
FROM Orders

Он объединяет значения varchar различных строк, сгруппированных по id. Но теперь я хочу включить его как подзапрос, и он дает некоторые ошибки, которые я не могу решить. Упрощенный пример использования:

select descriptions from 
(
    WITH Orders(Id)
    AS (
    SELECT DISTINCT anfrageid FROM MPHotlineAnfrageAnhang
    )
    SELECT Id,
    (
    SELECT CONVERT(VARCHAR(255),anfragetext) + ' | '
    FROM MPHotlineAnfrageAnhang
    WHERE anfrageid = Id
    ORDER BY anfrageid, erstelltam
    FOR XML PATH('')
    ) AS Descriptions
    FROM Orders
) as tx where id=100012

Ошибки (приблизительный перевод с испанского):

-Incorrect sintaxis near 'WITH'.
-Incorrect sintaxis near 'WITH'. If the instruction is a common table expression or a xmlnamespaces clause, the previous instruction must end with semicolon.
-Incorrect sintaxis near ')'.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 31 марта 2010

Цепочка ваших запросов как CTE, например:

WITH Orders(Id) AS (
    SELECT DISTINCT anfrageid
    FROM MPHotlineAnfrageAnhang
),
OrderDescs AS (
    SELECT Id, (
        SELECT CONVERT(VARCHAR(255),anfragetext) + ' | '
        FROM MPHotlineAnfrageAnhang
        WHERE anfrageid = Id
        ORDER BY anfrageid, erstelltam
        FOR XML PATH('')
        ) AS Description
    FROM Orders
)
SELECT Description
FROM OrderDescs
WHERE Id = 100012 

Вы можете иметь столько CTE, сколько хотите, каждый ссылаясь на предыдущий, перед фактическим запросом.

0 голосов
/ 31 марта 2010

Кроме того, перед оператором WITH необходимо использовать точку с запятой.

;with Orders(id)

Или завершить предыдущий оператор точкой с запятой.

...