按行分组到 SQL Server 表中的列

问题描述 投票:0回答:3

在SQL Server中,我维护了以下细节:

S.No 家长ID Child_ID 数量
1 1 1
2 1 2 2
3 2 3 4
4 5 2
5 5 6 5
6 6 7 1
7 1 2
8 1 7 3
9 7 9 1

需要的表格如下。

数量 Child_ID 团体
1 1 1
2 2 1,2
4 3 1,2,3
2 5 5
5 6 5,6
1 7 5,6,7
2 1 1
3 7 1,7
1 9 1,7,9

我尝试使用这段代码,但出现递归错误:

WITH GroupTable (Qty, Child_ID, Parent_ID,  Groups) AS
(
    SELECT 
        S.Qty, S.Child_ID, S.Parent_ID, 
        CONVERT(varchar(100), S.Child_ID) AS path
    FROM 
        tabel1 AS S 
    UNION ALL
    SELECT 
        S.Qty, S.Child_ID, p.Parent_ID,  
        CONVERT(varchar(100), (RTRIM(p.Groups) + ',' + 
                              CONVERT(varchar(100), S.Child_ID)))
    FROM 
        GroupTable AS p 
    JOIN 
        tabel1 AS S ON S.Parent_ID = p.Child_ID
)
SELECT
    Qty, Child_ID, Groups 
FROM
    GroupTable 
WHERE
    Parent_ID IS NULL

我收到这个错误:

消息 530,级别 16,状态 1,第 1 行语句终止。
语句完成前最大递归 100 已用完

sql sql-server view
3个回答
0
投票

我不明白你的问题,但根据你提供的错误,你可以在 SQL Server 中设置最大递归。在下面的示例中,我将 500 设置为最大 32,767,具体取决于 SQL Server 版本。

SELECT
    Qty, Child_ID, Groups 
FROM
    GroupTable 
WHERE
    Parent_ID IS NULL

OPTION (MAXRECURSION 500)

0
投票

对于最大递归问题,您可以使用:

FROM GroupTable
  option (maxrecursion 0)

0
投票

您正在达到

MAXRECURSION
上限,因为您获得了更多行,然后您期望 - 可能是因为您的专横逻辑或/和数据定义不明确。

例如,对于孩子

2
,您需要父对象
1
,但在您的基础数据中,您有父对象
1
的两条记录,因此在 CTE 的第一次迭代后您有更多行:

enter image description here

但在您的最终结果中,您只需要来自该组的数据:

使用你的真实数据,你可能会发现更多这样的案例,并且很难在最后过滤所有这些

SELECT
,否则你可能会得到错误的数据。

所以,你需要考虑如何定义这个组,因为目前是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.