首页 > 解决方案 > 如何编写这个 PL/SQL 查询?

问题描述

我有一个有 2 列的表:人 (1),他/她的朋友 (2)。

我需要一个查询来选择汤姆的所有朋友、他朋友的朋友、他们朋友的朋友等等…​​…也许一些 SQL 或 PL/SQL 可以做到这一点?

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

他/她的朋友
汤姆 萨拉
汤姆 安娜
安娜 汤姆
安娜 亚历克斯
亚历克斯 安娜
亚历克斯 丽莎

标签: sqloraclehierarchical-data

解决方案


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

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 loop in user data”错误。该NOCYCLE选项可防止这种重复,并允许查询完成而无需“返回”到已访问过的值。


推荐阅读