Sql server SQL中的递归CTE-如何避免重复结果?

Sql server SQL中的递归CTE-如何避免重复结果?,sql-server,tsql,recursion,common-table-expression,Sql Server,Tsql,Recursion,Common Table Expression,在我的SQL数据模型中,我有一个将客户与客户帐户链接起来的关系表。一个账户可以由多个客户持有,一个客户可以持有多个账户 我想找到客户之间的关系,同时显示帐户。为此,我创建了一个CTE,它给定一个customernumber,递归地获取该客户的关系和一个关系的关系 例如,假设我有以下数据集: 客户1,账户1 客户2,账户1 客户2,客户2 客户3,客户2 客户4,账户3 运行客户编号1的CTE我想获取客户1、2、3和客户1、2。然而,由于这是递归的,所以我也会将每个重复的关系1->2->1提取到预

在我的SQL数据模型中,我有一个将客户与客户帐户链接起来的关系表。一个账户可以由多个客户持有,一个客户可以持有多个账户

我想找到客户之间的关系,同时显示帐户。为此,我创建了一个CTE,它给定一个customernumber,递归地获取该客户的关系和一个关系的关系

例如,假设我有以下数据集:

客户1,账户1 客户2,账户1 客户2,客户2 客户3,客户2 客户4,账户3 运行客户编号1的CTE我想获取客户1、2、3和客户1、2。然而,由于这是递归的,所以我也会将每个重复的关系1->2->1提取到预设的最大深度。是否有任何方法可以标记现有关系,使其不会被重复选择

以下是我的CTE,基于Microsoft的CTE示例:

WITH EntityRelations(CUSTOMERNUMBER, ACCOUNTID, RELATEDWITH, Level)
AS
(
    SELECT 
        C.CUSTOMERNUMBER, 
        A.ACCOUNTNUMBER, 
        CREL.CUSTOMER related, 
        0 as level
    FROM CUSTOMER_ACCOUNT CA
    INNER JOIN CUSTOMER C
        ON C.ID = CA.CUSTOMERID
    INNER JOIN ACCOUNT A
        ON A.ID = CA.ACCOUNTID
    --Get direct relationships
    LEFT JOIN CUSTOMER_ACCOUNT CREL
        ON CREL.ACCOUNTID = CA.ACCOUNTID
        AND CREL.CUSTOMERID <> CA.CUSTOMERID
    WHERE BCE.CUSTOMER = 1

    UNION ALL
    --Recursion
    SELECT 
        C.CUSTOMERNUMBER, 
        A.ID, 
        CREL.CUSTOMER related, 
        Level+1
    FROM CUSTOMER_ACCOUNT CA
    INNER JOIN CUSTOMER C
        ON C.ID = CA.CUSTOMERID
    INNER JOIN ACCOUNT A
        ON A.ID = CA.ACCOUNTID
    --Get direct relationships
    LEFT JOIN CUSTOMER_ACCOUNT CREL
        ON CREL.ACCOUNTID = CA.ACCOUNTID
        AND CREL.CUSTOMERID <> CA.CUSTOMERID
    INNER JOIN EntityRelations ER
        ON ER.RELATEDWITH = CA.CUSTOMERID
    WHERE Level < 3 --Maximum
)

SELECT * FROM EntityRelations 
在您的选择中,保留客户的csv列表,然后检查列表中是否有新客户

一个基本的伪代码

 SELECT .... , ',' as lstCustomer   -- empty list

 UNION ALL

 SELECT .... ,  customerID || ',' as lstCustomer -- add new customer

 WHERE ',' || lstCustomer || ',' 
       NOT LIKE '%,' || customerID  || ',%'  
                         -- Check if list already have this customer
编辑:我假设你想限制客户出现的数量,如果你想限制客户的数量,你可以这样做

 UNION ALL

 SELECT .... ,  '{' || customerID || '-' || accountID || '},' as lstCustomer 
                -- add new customer

 WHERE ',' || lstCustomer || ',' 
       NOT LIKE '%,{' || customerID  || '-' || accountID || '},%'  
                         -- Check if list already have this customer

你可以找到一个很好的方法来做这件事,并且可能是重复的