Du könntest zuerst mal die Referenzielle Integrität der Tabelle prüfen, d.h. dass es keine Ungültigen Verknüpfungen gibt:
Datensätze mit ungültigen Parents (non-existent parent):
SQL-Anweisung
1:
| SELECT id FROM tbl WHERE NOT (parentid in (SELECT DISTINCT id from tbl)) AND id <> 1 |
Danach die Anwendung der entsprechenden graphentheoretischen Algorithmen für die Kreis-Erkennung in ne Stored Procedure packen und diese Selecten.
Den Hinweis von Christian kann man hier als goldwerten Tipp nehmen, wenn diese Eigenschaft der Daten bereits gegeben ist. Ansonsten sollte man diese durch einen View entsprechend erzeugen.
Ferner bieten manche DBMS (bekannt von Oracle) sog. Hierarchische Selects an. Diese kann man u.U. dazu missbrauchen, um jegliche Datensätze zu filtern, denen das DBMS keine eindeutige Ebene zuordnen kann. Ist diese Option nicht möglich, kann man dies mit einer\zwei Temporär-Tabellen nachbilden, von denen die erste alle Quell-IDs enthält und die zweite Schritt für Schritt mit all den IDs befüllt wird, die mit den derzeitig in der Tabelle enthaltenen IDs über den Parent erreicht werden können:
SQL-Anweisung
1:
| INSERT INTO tmptbl_reachable SELECT id FROM tmptbl_allids WHERE tmptbl_allids.id IN (SELECT id FROM tmptbl_reachable) |
Solange neue Datensätze hinzugefügt wurden, fortsetzen. Solange Datensatz 1 nicht auf einen weiter unten in der Hierarchie versteckten Datensatz zeigt, ist bei diesem Ansatz die Kreisfreiheit garantiert

(Beweis bleibt dem Fragesteller überlassen).
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.