sql - 如何编写这个 PL/SQL 查询?
问题描述
我有一个有 2 列的表:人 (1),他/她的朋友 (2)。
我需要一个查询来选择汤姆的所有朋友、他朋友的朋友、他们朋友的朋友等等……也许一些 SQL 或 PL/SQL 可以做到这一点?
例如,对于 Tom,此查询应返回:Sara、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 loop in user data”错误。该NOCYCLE
选项可防止这种重复,并允许查询完成而无需“返回”到已访问过的值。
推荐阅读
- google-sheets - Google 电子表格的链接共享
- html - 为什么文本被推向圆圈的顶部
- django - 将外键字段和选择字符字段添加到 Django 用户创建表单
- wso2 - WSO2 Lopp 通过 Json 数组
- jquery - JQuery Datatable 的 rowReorder 问题
- java - 如何将 Spring Batch RetryTemplate 应用于基于块的 Step / ItemWriter?
- elasticsearch - 异常堆栈跟踪的 GROK 模式
- python - 如果 user.is_authenticated 没有登录用户 django
- c - 仅使用 For 循环反转字符串
- mysql - MySQL JSON 搜索数组内的值