说我有这样一张桌子:
Child | Parent
并使用相同的数据来识别每个子父母,如下所示:
Child | Parent
---------------
1 2
2 1
3 4
5 4
前两行形成一种无限关系,因为2是1的父级,但1也是2的父级,所以它在搜索父级时是一个永无止境的循环。 如何在SQL中找到具有这种关系的所有行? 我以为我必须使用
START WITH and CONNECT BY
但是无法完成查询以便运行,任何帮助都会非常感激!
答案 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