Tsql T-sql公共表达式查询作为子查询
我有以下疑问:Tsql T-sql公共表达式查询作为子查询,tsql,subquery,common-table-expression,Tsql,Subquery,Common Table Expression,我有以下疑问: 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('') )
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
它连接按id分组的不同行的varchar值。但现在我想将其作为子查询包含,它给出了一些我无法解决的错误。
使用的简化示例:
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 ')'.
我做错了什么?将您的查询链接为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,每个CTE都引用上一个CTE。将查询链接为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,每个CTE都引用上一个CTE。此外,WITH语句之前需要有分号
;with Orders(id)
或者用分号来终止前面的语句。另外,with语句之前需要有分号
;with Orders(id)
或者用分号来终止前面的语句。如果您已经看到了测试用例示例,那么没有前面的语句,并且尝试您的解决方案会给出:在“;”旁边有不正确的语法和不正确的语法旁边啊,抱歉我错过了与第二个代码示例!Matt Hamilton方法应该做你想做的事情,没有任何语法错误,你不能在子查询中使用With。如果你看过测试用例示例,没有前面的语句,尝试你的解决方案会给出:在“;”旁边有不正确的语法和不正确的语法旁边啊,抱歉我错过了与第二个代码示例!Matt Hamiltons方法应该做你想做的事情,没有任何语法错误,你不能在子查询中使用With。看不到如何应用它:S你能重构我的示例查询,以便我在上下文中理解它吗?@ase69s看我有多接近了!:有效:!一个问题是,为了避免混淆,我发布的查询是一个简化的查询,但在实际情况中,查询非常长,格式如下:选择t1.field1、t2.field1、field2、field3、field4,子查询由一些代码链接,子查询2由一些代码链接,子查询3由表t1中的一些代码链接,表2 t2,其中。。。正如您所看到的,te子查询是自动包含的…更易于管理。那么,我如何重新格式化您的版本,以便像其他版本一样包含它呢?@ase69s,子查询是自动包含的……更易于管理,但这些都是巨大的性能消耗,因为它们对返回的每个结果集行都运行一次。如果你能使用联接或派生表重写它们,你会更好。是的,这是一个已知的问题,但现在…知道如何做也很有趣。看不到如何应用它:你能重构我的示例查询以便我能在上下文中理解它吗?@ase69s看我有多接近了!:有效:!一个问题是,为了避免混淆,我发布的查询是一个简化的查询,但在实际情况中,查询非常长,格式如下:选择t1.field1、t2.field1、field2、field3、field4,子查询由一些代码链接,子查询2由一些代码链接,子查询3由表t1中的一些代码链接,表2 t2,其中。。。正如您所看到的,te子查询是自动包含的…更易于管理。那么,我如何重新格式化您的版本,以便像其他版本一样包含它呢?@ase69s,子查询是自动包含的……更易于管理,但这些都是巨大的性能消耗,因为它们对返回的每个结果集行都运行一次。如果你能用连接或派生表重写它们,你会更好。是的,这是一个已知的问题,但现在…知道如何做也会很有趣。