如何编写此 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
选项可防止这种重复并允许查询完成而无需“返回”到它已经访问过的值。
我有一个包含 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
选项可防止这种重复并允许查询完成而无需“返回”到它已经访问过的值。