如何编写此 PL/SQL 查询?

How do I write this PL/SQL query?

我有一个包含 2 列的 table:人物 (1),his/her 朋友 (2)。

我需要查询 select Tom 的所有朋友、他朋友的朋友、他们朋友的朋友等等...也许 SQL 或 PL/SQL 可以做这个?

例如,对于 Tom,此查询应 return:Sara、Anna、Alex、Lisa。

Person His/Her friends
Tom Sara
Tom Anna
Anna Tom
Anna Alex
Alex Anna
Alex Lisa

您可以使用分层查询从朋友继续到朋友或朋友等等:

SELECT     DISTINCT friend_name
FROM       friends
WHERE      friend_name != 'Tom'
START WITH name = 'Tom'
CONNECT BY NOCYCLE PRIOR friend_name = name

编辑:
要解决有关 nocycle 选项的评论中的问题:在没有任何限制的情况下,分层查询理论上可以永远递归。例如,根据这些数据,Tome 有一个叫 Anna 的朋友。反过来,Anna 有一个叫 Tom 的朋友,在没有任何限制的情况下,查询可以在这两个朋友之间无限期地进行,这将导致查询失败并出现“ORA-01436:用户数据中的 CONNECT BY 循环”错误。 NOCYCLE 选项可防止这种重复并允许查询完成而无需“返回”到它已经访问过的值。