sql - Oracle SQL 循环自连接

标签 sql oracle optimization recursive-query self-join

上下文:
假设我有一个表有一个引用它自己的 PRIMARY KEY 的 FOREIGN KEY,如下所示:

|---------------------|------------------|------------------|
|          ID         |       NAME       |     PARENT_ID    |
|---------------------|------------------|------------------|
|          01         |       John       |         04       |
|---------------------|------------------|------------------|
|          02         |       Paul       |         01       |
|---------------------|------------------|------------------|
|          03         |       George     |         02       |
|---------------------|------------------|------------------|
|          04         |       Ringo      |         03       |
|---------------------|------------------|------------------|


问题:
因此,如您所见,存在循环层次结构:Ringo->George->Paul->John->Ringo->George->Paul->John->etc.

问题:
有没有SQL select可以检测到这种循环?

我知道我可以编写递归 PL/SQL 过程,但我更喜欢使用“纯”SQL 的解决方案。

提前致谢

最佳答案

您可以使用带有 CONNECT_BY_ISCYCLE 伪列的 CONNECT BY 查询来查找循环 - 请参阅 example from Oracle docs :

SELECT last_name "Employee", CONNECT_BY_ISCYCLE "Cycle"
FROM employees
WHERE level <= 3 
AND   department_id = 80
START WITH last_name = 'King'
CONNECT BY NOCYCLE PRIOR employee_id = manager_id;

关于sql - Oracle SQL 循环自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61008699/

相关文章:

php - MySQL - 带有变量的 SELECT 查询不会执行

c# - 通过动态创建 linq 查询在 c# 中为 Sql 等效项 "column is null"创建 Linq 表达式

oracle - oracle sql开发人员崩溃

oracle - 将昨天的日期与特定时间连接起来

oracle - 不能在 CREATE TABLE 中使用内联约束

android - 线程 sleep 准确性

mysql - sql插入时如何替换NULL值

sql - 在 SQL 中查找数据模式

Python:需要优化过滤字符方法运行时的建议

php - 为用户启用黑名单的最佳方式