在SQL中寻找无限的关系

时间:2014-12-09 12:44:18

标签: sql oracle

说我有这样一张桌子:

Child | Parent

并使用相同的数据来识别每个子父母,如下所示:

Child | Parent
---------------
1      2
2      1
3      4
5      4

前两行形成一种无限关系,因为2是1的父级,但1也是2的父级,所以它在搜索父级时是一个永无止境的循环。 如何在SQL中找到具有这种关系的所有行? 我以为我必须使用

START WITH and CONNECT BY

但是无法完成查询以便运行,任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

对同一个表的简单内部联接是否不能满足您的需求?

SELECT table1.Parent as Row, table1.Child as OtherRow
FROM table table1
    inner join table table2
    ON table1.Parent = table2.Child
    AND table1.Child = table2.Parent

这会给你" Parent-> Child"每场比赛的行,如下:

Row | OtherRow
----|----------
  1 |  2

但是你可以使用结果作为子查询来拉出所有行

例如

SELECT table.Parent as Parent, table.Child as Child
FROM table
    INNER JOIN (that query) query
    ON (table.Parent = query.Row AND table.Child = query.OtherRow)
        OR (table.Parent = query.OtherRow AND table.Child = query.Row)

这会给你

Parent | Child
-------|------
   1   |   2
   2   |   1

答案 1 :(得分:0)

您可以使用NOCYCLE选项和伪列CONNECT_BY_ISCYCLE。

编写分层查询,它应该因为该循环而失败。然后将NOCYCLE选项和CONNECT_BY_ISCYCLE列添加到select子句中,它将帮助您识别循环。

非常好的例子在这里:http://www.dba-oracle.com/t_advanced_sql_connect_by_loop.htm

https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315