Su código funcionará bien excepto solo por una condición de datos que es cuando su to_customer (1000022560394) haya iniciado la transacción en primer lugar y después de algún nivel de transacción se le devuelva solo a él.
Por ejemplo, Conjunto de datos de muestra
En este caso, la parte recursiva de la consulta encontrará que todas sus condiciones son verdaderas incluso al final de la transacción, ya que los datos estarán allí tanto en la tabla normal como en el conjunto de datos incremental.
Una solución es crear una bandera de coincidencia para determinar su número de encuentros y evitar bucles 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;