如何在无向循环图中对所有链接对象进行分组

时间:2016-10-24 16:36:04

标签: sql sql-server

我有一张桌子,有客户及其共同客户。例如,客户1有一个共同客户2.客户1也是客户3的共同客户。

我正在尝试对所有已关联的客户进行分组,并为其分配相同的GroupCustNo。在下表1-2中链接,3-1链接。所以2-3也有联系。因此,下表中1到8的所有客户都相互关联,并且具有相同的GroupCustNo

tbl_GroupCustomers

CustNo   JtCustNo  GroupCustNo    
---      -------     ------   
1           2          null
2           null       null
3           1          null
4           1          null
4           5          null
5           6          null
5           7          null
6           null       null
7           null       null
8           5          null

我写的递归存储过程如下。我在每个CustNo的while循环中调用它:

exec usp_UpdateGroupCustomerNo 1, 1

对于大多数客户,存储过程成功运行但是已经抛出

  

达到32的递归限制

某些客户的错误

。这些客户拥有许多共同客户,也是其他客户的共同客户。

这似乎递归不会在这里工作,我不知道如何继续。如果有其他方法可以解决这个问题,请告诉我。

CREATE PROCEDURE [dbo].[usp_UpdateGroupCustomerNo]
    @MainCustNo int, @GrpNo int
AS 
    declare @JtCustNo int; declare @MainCustNo2 int;

    if exists(select 1 from tbl_GroupCustomer 
              where CustNo = @MainCustNo and groupcustomernumber is null)
    begin    
        update tbl_GroupCustomer 
        set groupcustomernumber = @grpno 
        where CustNo = @MainCustNo 
          and groupcustomernumber is null

        DECLARE db_cursor CURSOR LOCAL FOR  
             select JtCustNo 
             from tbl_GroupCustomer 
             where CustNo = @MainCustNo and JtCustNo is not null

        OPEN db_cursor   

        FETCH NEXT FROM db_cursor INTO @JtCustNo   

        WHILE @@FETCH_STATUS = 0   
        BEGIN   
            select @JtCustNo as JtCustNo      

            exec usp_UpdateGroupCustomerNo @JtCustNo, @GrpNo

            DECLARE db_cursor2 CURSOR LOCAL FOR  
                select CustNo 
                from tbl_GroupCustomer 
                where JtCustNo = @JtCustNo 
                  and groupcustomernumber is null

            OPEN db_cursor2

            FETCH NEXT FROM db_cursor2 INTO @MainCustNo2   

            WHILE @@FETCH_STATUS = 0   
            BEGIN   
                if exists(select 1 from tbl_GroupCustomer 
                          where CustNo = @MainCustNo2 
                            and groupcustomernumber is null)
                begin     
                    exec usp_UpdateGroupCustomerNo @MainCustNo2, @GrpNo
                end

                FETCH NEXT FROM db_cursor INTO @MainCustNo2   
            END   

            CLOSE db_cursor2   
            DEALLOCATE db_cursor2

            FETCH NEXT FROM db_cursor INTO @JtCustNo   
    END  

    CLOSE db_cursor   
    DEALLOCATE db_cursor
END

0 个答案:

没有答案