Seu código funcionará bem, exceto apenas por uma condição de dados que é quando seu to_customer (1000022560394) iniciou a transação em primeiro lugar e depois de algum nível de transação ela está sendo retornada apenas para ele.
Por exemplo, Conjunto de dados de amostra
Para este caso, sua parte recursiva da consulta encontrará todas as suas condições verdadeiras mesmo no final da transação, pois os dados estarão lá tanto na sua tabela normal quanto no conjunto de dados incremental.
Uma solução é criar um match-flag para determinar seu número de encontros e evitar loops infinitos:
WITH EmpsCTE (affiliation_id, from_customer_id,to_customer_id, to_name,level1,match_count)
AS
(
SELECT affiliation_id, from_customer_id,to_customer_id, to_name, 0, 0 match_count
FROM affiliation aff
WHERE to_customer_id != from_customer_id
and to_customer_id = 1000022560394
UNION ALL
SELECT aff.affiliation_id, aff.from_customer_id,aff.to_customer_id, aff.to_name, m.level1 + 1,1 match_count
FROM affiliation aff
INNER JOIN EmpsCTE m
ON aff.to_customer_id = m.from_customer_id
where m.match_count=0
)
SELECT * FROM EmpsCTE;