问题:
在下面的查询中,我想要
的等价物GROUP_CONCAT(ctAncestors.ancestor ORDER BY ctAncestors.depth DESC) AS breadcrumbs_id
在火鸟中。
到目前为止,我得到了
LIST(ctAncestors.ancestor, ',') AS breadcrumbs_id
但我无法弄清楚如何在list指令中添加订单。
如何在List聚合中执行订单?
-- http://www.unlimitedtricks.com/sorting-a-subtree-in-a-closure-table-hierarchical-data-structure/
-- DECLARE @__in_rootnodeId AS bigint
-- SET @__in_rootnodeId = 8
-- SET @__in_rootnodeId = 1
SELECT
COALESCE(ctDescendants.ancestor, 0) AS parent_id
,ctAncestors.descendant AS child_id
,tClosureItemsTable.COM_Id
,tClosureItemsTable.COM_Text
--,'ab' as breadcrumbs
--,LIST(ctAncestors.ancestor ORDER BY ctAncestors.depth DESC) AS breadcrumbs_id
,LIST(ctAncestors.ancestor, ',') AS breadcrumbs_id
--,GROUP_CONCAT(ctAncestors.ancestor ORDER BY ctAncestors.depth DESC) AS breadcrumbs_id
-- ,GROUP_CONCAT(breadcrumb_data.COM_Text ORDER BY ctAncestors.depth DESC) AS breadcrumbs
--,GROUP_CONCAT(breadcrumb_data.COM_Text ORDER BY ctAncestors.depth) AS breadcrumbs
,LIST(breadcrumb_data.COM_Text) AS breadcrumbs
--,GROUP_CONCAT(breadcrumb_data.COM_Text ORDER BY ctAncestors.depth DESC SEPARATOR '-') AS breadcrumbs2
/*
,
SUBSTRING
(
(
SELECT
-- breadcrumb.ancestor AS 'text()' -- Remove substring for this
-- ', ' + CAST(breadcrumb.ancestor AS nvarchar(36)) AS 'text()'
', ' + CAST(breadcrumb_data.comment AS nvarchar(36)) AS 'text()'
FROM T_CommentClosure AS breadcrumb
LEFT JOIN Comments AS breadcrumb_data
ON breadcrumb_data.COM_Id = breadcrumb.ancestor
WHERE (breadcrumb.descendant = ctAncestors.descendant)
ORDER BY breadcrumb.depth DESC
FOR XML PATH('')
)
,2
,8000
) AS breadcrumbs
*/
,
(
SELECT COUNT(*) FROM T_CommentClosure AS tp
WHERE tp.ancestor = tClosureItemsTable.COM_Id AND tp.depth = 1
) AS ChildCount
FROM T_CommentClosure AS ctAncestors
-- Must be left join, for root node
LEFT JOIN T_CommentClosure AS ctDescendants
ON (ctDescendants.descendant = ctAncestors.descendant)
AND (ctDescendants.depth = 1)
-- INNER JOIN just in case item has been somehow deleted when FK disabled
INNER JOIN T_Comments AS tClosureItemsTable
ON (ctAncestors.descendant = tClosureItemsTable.COM_Id)
INNER JOIN T_Comments AS breadcrumb_data
ON breadcrumb_data.COM_Id = ctAncestors.ancestor
WHERE (1=1)
-- AND (ctAncestors.ancestor = @__in_rootnodeId) -- ROOT node id
AND
(
-- ( ctAncestors.ancestor = @__in_rootnodeId) -- ROOT node id
(1=2)
OR
(1=1)
-- (@__in_rootnodeId IS NULL)
)
-- AND tClosureItemsTable.active = 1
GROUP BY
ctAncestors.descendant
,ctDescendants.ancestor
,tClosureItemsTable.COM_Id
,tClosureItemsTable.COM_Text
ORDER BY breadcrumbs ASC -- DESC
答案 0 :(得分:6)
正如LIST()
所述的文件:
列表值的排序未定义。
也就是说,如果您使用首先按GROUP BY
- 列和此列排序的子查询或公用表表达式(CTE),那么它将起作用,但这确实意味着您依赖于实现工件这可能会随点发布或新版本而改变。
Firebird跟踪器中有一个改进票证(CORE-2332),但尚未针对某个版本进行规划。此票证还包含解决方法的示例:
WITH EDU_EPT AS (
SELECT EEPT2.TARGET_SWE
FROM EDUCATION_EVENT_PR_TRGT EEPT2
WHERE EEPT2.EDUCATION_EVENT_ID = :EDU_EVENT_ID
ORDER BY EEPT2.ORDINAL, EEPT2.ID
)
SELECT LIST('• ' || EEPT.TARGET_SWE, ASCII_CHAR(13) || ASCII_CHAR(10)) || '.'
FROM EDU_EPT EEPT