• Here is the recursive CTE solution.

    Not sure if it will be any quicker at all, and you still need to know the max iteration depth to put in an exit condition.

    WITH

    recursiveCTE AS (

    SELECTorderid,

    o.partykey,

    p.personId,

    1 AS incrementNbr

    FROM #orders o

    INNER JOIN #personIds p

    ON p.partykey = o.partykey

    UNION ALL

    SELECT r.orderid,

    p2.partykey,

    p2.personId,

    incrementNbr + 1 AS incrementNbr

    FROM recursiveCTE r

    INNER JOIN #personIds p1

    ON p1.partykey = r.partykey

    INNER JOIN #personIds p2

    ON p2.personId = p1.personId

    AND p2.partykey <> r.partykey

    WHERE incrementNbr < 10

    )

    SELECT orderid,partykey,min(incrementNbr) AS nbrOfIterations

    FROM recursiveCTE

    GROUP by orderid,partykey

    ORDER BY orderid, min(incrementNbr),partykey