zapytanie wyciągające wszystkie rekordy wyżej w chierarchi

0

Mam problem do rozwiązania:

jest sobie tabelka z wieloma polami a w tym jeden FK odwołujący się do samej siebie pod nazwą "parent". Było to potrzebne do utworzenia drzewiastej struktury.

Teraz problem polega na tym, że mając dowolny rekord mam wylistować wszystkich jego przedków używając możliwie jak najmniej zapytań i to niezależnie od zagłębienia. Co ciekawe w drugą stronę też by sie przydało...

Dodatkowe szczegóły są takie, że główny rekord ma parent=NULL

mój pomysł to było po prostu pytanie dopóki nie dostanie się null ale potrafi przez to wyjść mnóstwo zapytań, no i stąd moje pytanie.

0

Nie piszesz o jaki system baz danych chodzi, więc podaję rozwiązanie w Oracle.
To o co pytasz to tzw. zapytania hierarchiczne. Za pomocą jednej kwerendy jesteś w stanie prześledzić zależności w obie strony

CREATE TABLE emp (
 empno NUMBER(4) UNIQUE NOT NULL,
 mgr NUMBER(4),
 name VARCHAR2(20)
);

BEGIN
 INSERT INTO emp VALUES(7788,7566,'Kowalski');
 INSERT INTO emp VALUES(7902,7566,'Nowak');
 INSERT INTO emp VALUES(7499,7698,'Kozłowski');
 INSERT INTO emp VALUES(7521,7698,'Malinowski');
 INSERT INTO emp VALUES(7900,7698,'Nowicki');
 INSERT INTO emp VALUES(7844,7698,'Pawlak');
 INSERT INTO emp VALUES(7654,7698,'Sobociński');
 INSERT INTO emp VALUES(7934,7782,'Karolak');
 INSERT INTO emp VALUES(7876,7788,'Adamczak');
 INSERT INTO emp VALUES(7566,7839,'Majewski');
 INSERT INTO emp VALUES(7782,7839,'Krysiak');
 INSERT INTO emp VALUES(7698,7839,'Nowakowski');
 INSERT INTO emp VALUES(7369,7902,'Jurek');
 INSERT INTO emp VALUES(7839,NULL,'Król');
 COMMIT;
END;

SELECT tree FROM (
  SELECT LTRIM(SYS_CONNECT_BY_PATH(name, ' -- '), ' -- ') AS tree
  FROM emp
  START WITH empno = 7654
  CONNECT BY PRIOR mgr = empno
  ORDER BY LENGTH(tree) DESC)
WHERE ROWNUM = 1;
0

a nie myslales o nestedset ? jednym prostym zapytaniem pobralbys wszystkich rodzicow, potomkow etc
minus taki ze przynajmniej dwa polwa wiecej w tabeli no i troche upierdliwe wstawianie rekordow

0

Kurde, głupi jestem, chodziło mi o MySQL... najlepiej jakby chodziło na czymkolwiek, ale jak będzie chodziło na MySQL to będzie ok

//o nested set... hm... erm, jak by to określić: po szybkich poszukiwaniach i szybkim przejrzeniu problemu.. Kurde, ale to skomplikowane albo nie rozumiem i musiałbym nad tym siąść... Może jednak zapisywać level w drzewie i na podstawie levelu w dwóch zapytaniach (to drugie dość głupie) zapytać o parenta... Nie planuje usuwać żadnych elementów z drzwa oprócz liści, tzn. jak parent nie ma żadnych childów, dopiero wtedy może zostać usunięty, a tak to nie ma mowy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1