You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SQL Server存储过程实现6×6上行自动溢出层级表系统遇阻求助

解决6×6上行溢出层级表的SQL Server存储过程方案

看起来你正在搭建的是典型的矩阵式层级网络系统,核心逻辑是第一层满6人后,新用户按注册顺序依次分配给第一层的每个成员,直到每个第一层成员都满6个下属(刚好36个第二层用户)。我之前做过类似的层级分配需求,给你梳理下可行的实现思路和存储过程代码:

第一步:定义基础数据表

首先需要一个用户表来存储层级关系,核心字段要包含用户ID、名称、上级ID、层级、注册时间(用来确定分配顺序):

CREATE TABLE MMN_Users (
    UserID INT IDENTITY(1,1) PRIMARY KEY,
    UserName NVARCHAR(50) NOT NULL,
    ParentID INT NULL FOREIGN KEY REFERENCES MMN_Users(UserID),
    Level INT NOT NULL,
    RegisterTime DATETIME DEFAULT GETDATE()
);

第二步:实现自动分配逻辑的存储过程

这个存储过程会自动判断新用户应该归属的上级,完全符合你描述的溢出规则:

CREATE PROCEDURE sp_RegisterMMNUser
    @UserName NVARCHAR(50),
    @NewUserID INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    -- 1. 检查第一层是否还有空位(最多6人)
    DECLARE @Level1Count INT;
    SELECT @Level1Count = COUNT(*) FROM MMN_Users WHERE Level = 1;

    IF @Level1Count < 6
    BEGIN
        -- 直接插入第一层
        INSERT INTO MMN_Users(UserName, ParentID, Level)
        VALUES (@UserName, NULL, 1);
        SET @NewUserID = SCOPE_IDENTITY();
        RETURN;
    END

    -- 2. 第一层已满,按注册顺序找下属不足6个的第一层用户
    DECLARE @TargetParentID INT;
    SELECT TOP 1 @TargetParentID = u.UserID
    FROM MMN_Users u
    LEFT JOIN (
        SELECT ParentID, COUNT(*) AS ChildCount
        FROM MMN_Users
        WHERE Level = 2
        GROUP BY ParentID
    ) c ON u.UserID = c.ParentID
    WHERE u.Level = 1
    AND ISNULL(c.ChildCount, 0) < 6
    ORDER BY u.RegisterTime ASC, ISNULL(c.ChildCount, 0) ASC;

    -- 3. 插入新用户到找到的上级节点下
    INSERT INTO MMN_Users(UserName, ParentID, Level)
    VALUES (@UserName, @TargetParentID, 2);
    SET @NewUserID = SCOPE_IDENTITY();
END

关键逻辑解释

  • 第一层判断:先统计第一层用户数量,不足6个直接加入第一层,符合初始规则。
  • 上级节点选择:通过左连接统计每个第一层用户的下属数量,按第一层用户的注册时间排序(保证John、Peter的分配顺序),优先给下属少的(未达6个的)分配新用户,完全匹配你说的第7个归John、第8个归Peter的需求。
  • 输出新用户ID:方便后续业务逻辑调用使用。

测试建议

你可以按顺序插入测试用户验证逻辑:

-- 插入6个第一层用户
DECLARE @ID INT;
EXEC sp_RegisterMMNUser 'John', @ID OUTPUT;
EXEC sp_RegisterMMNUser 'Peter', @ID OUTPUT;
EXEC sp_RegisterMMNUser 'Mary', @ID OUTPUT;
EXEC sp_RegisterMMNUser 'Lary', @ID OUTPUT;
EXEC sp_RegisterMMNUser 'Anderson', @ID OUTPUT;
EXEC sp_RegisterMMNUser 'Paul', @ID OUTPUT;

-- 插入第7个用户,归属John
EXEC sp_RegisterMMNUser 'User7', @ID OUTPUT;
-- 插入第8个用户,归属Peter
EXEC sp_RegisterMMNUser 'User8', @ID OUTPUT;

然后查询验证层级关系:

SELECT u.UserName, p.UserName AS ParentName, u.Level
FROM MMN_Users u
LEFT JOIN MMN_Users p ON u.ParentID = p.UserID
ORDER BY u.RegisterTime;

这个方案用简单的聚合和排序实现分配逻辑,在SQL Server里效率很高,即使到36个第二层用户也能快速定位目标上级,应该能解决你当前遇到的瓶颈。

内容的提问来源于stack exchange,提问作者Anderson Muniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:35:41