/ / Jak znaleźć cykle między pozycjami db? - sql, baza danych, sqlite

Jak znaleźć cykle między pozycjami db? - sql, baza danych, sqlite

Mam tabelę bazy danych, jak na przykład:

kolumna 1 | kolumna 2

x | Y

y | z

z | x

Więc w zasadzie x-> y-> z-> x.

Teraz muszę wykryć takie wpisy w DB. Jednym rozwiązaniem może być pobranie tych wpisów i zrobienie wykresu w pamięci, a następnie wykrycie cyklu za pomocą algorytmu znajdowania cykli. Wolałbym jednak zrobić to z zapytaniem SQL, jeśli to możliwe.

Odpowiedzi:

1 dla odpowiedzi № 1

SQLite nie obsługuje kwerend rekursywnych, więc najlepiej jest wykryć cykle o stałej długości za pomocą samo łączeń. Nie można wykryć cykli o dowolnej długości.

Oto przykład sprzężenia, który znajduje cykle o długości 2, podobnie jak przykład pokazany w pytaniu.

SELECT ...
FROM t AS t0
JOIN t AS t1 ON t0.column2 = t1.column1
JOIN t AS t2 ON t1.column2 = t2.column1
WHERE t2.column2 = t0.column1

Wpisz swój komentarz:

Jeśli chcesz wykryć cykle dowolnej długości, wszystko, co mogę zasugerować, to to, że musisz przechowywać więcej niż bezpośrednie linki. Musisz także przechowywać przechodnie, tj. każda ścieżka przez twoje wykresy. Jest to najlepszy sposób na to, aby ta wyszukiwarka była wydajna. Oczywiście zajmuje to o wiele więcej miejsca, ale jest kompromis. I zajmuje mniej miejsca niż myślisz.

Wykonałem projekt zamknięcia dla drzew, ale nie wykresy acykliczne Zobacz moją odpowiedź Jaki jest najbardziej wydajny / elegancki sposób na sprzeniedzenie płaskiego stołu w drzewo? lub moja prezentacja Modele danych hierarchicznych za pomocą SQL.