No cóż, na podstawie odpowiedzi @Jan_J stwierdzam, że mogłem zbyt dosłownie podejść do problemu.
Zrozumiałem o co chodzi z kolumną Parent (rodzic). Otóż mogą być wprowadzane dane:
Id = 1; Name = nazwa owocu; Parent = 0; (nowy element, dlatego Parent = 0)
Id = 2; Name = nowy owoc; Parent = 0; (nowy element, dlatego Parent = 0)
Id = 3; Name = odmiana owocu; Parent = I; (pozycja ta dotyczy rekordu wprowadzonego wcześniej do Id=1, Parent = Id )
Id = 4; Name = kolor owocu; Parent = 3; (pozycja ta dotyczy rekordu wprowadzonego wcześniej do Id=3, Parent= Id )
itd...
Dla takich rekordów moja wcześniejsza odpowiedź jest nie przydatna.
Dla nich zbudowałbym formularz z pod formularzami:
- formularzem głównym byłaby przefiltrowana TabelaDanych, warunek filtru to Parent = 0;
- podfolmularzem byłaby ta sama TabelaDanych, połączenie danych odbywałoby się dzięki polu formularza glównego Id a w podformularzu Parent ;
- pod-podfolmularzem byłaby znowu TabelaDanych, połączenie danych odbyło by się analogicznie tak jak wcześniej czyli dzięki polom Id (podformularza) i Parent (pod-podformularza)
-----------------------------------------
Edit 1:
Bawiłem się kodem zaproponowanym przez @Jan_J i dzięki niemu udało się uzyskać wymagany efekt:
Kod: Zaznacz cały
SELECT "Id", "Name", "Parent",
CASE WHEN "Parent" = 0 THEN "Name" ELSE "Kat1" END AS "kol1",
CASE WHEN "Parent" = 0 THEN NULL ELSE "Kat12" END AS "kol2",
CASE WHEN "Id" = "ID3" THEN "Kat123" ELSE NULL END AS "kol3"
FROM "TabelaDanych" LEFT JOIN (
SELECT "T1"."Name" AS "Kat1", "T2"."Name" AS "Kat12", "T3"."Name" AS "Kat123",
"T2"."Id" AS "ID2", "T3"."Id" AS "ID3"
FROM "TabelaDanych" AS "T1"
LEFT JOIN "TabelaDanych" AS "T2" ON ( "T1"."Id" = "T2"."Parent" )
LEFT JOIN "TabelaDanych" AS "T3" ON ( "T2"."Id" = "T3"."Parent" )
WHERE "T1"."Parent" = 0
) AS "T" ON ( "TabelaDanych"."Id" = "T"."ID2" OR "TabelaDanych"."Id" = "T"."ID3" )
ORDER BY "kol1" ASC, "kol2" ASC, "kol3" ASC
-----------------------------------------
Edit 2:
Eksperymentowałem z HSQL w wersji 2.3. - on obsługuje "Struktury rekurencyjne", wymagany efekt uzyskałem tworząc kwerendę SQL:
Kod: Zaznacz cały
WITH RECURSIVE "tree" ("Pokolenie", "Rodzic", "OsobaId","Kat1","Kat12","Kat123") AS
(
SELECT 1, "Parlent", "Id","Name",null,null FROM "TabelaDanych" WHERE "Parlent" = 0
UNION
SELECT "Pokolenie" + 1, "Parlent", "Id","Kat1",
case when "Pokolenie" + 1 = 2 then "Name" else "Kat12"end,
case when "Pokolenie" + 1 = 3 then "Name" else null end
FROM "TabelaDanych", "tree" WHERE "Parlent" = "OsobaId"
) SELECT * FROM "tree" order by "Kat1","Kat12"
Polecenie to działa tylko z silnikiem HSQLDB 2.3 oraz przy wciśniętym przycisku "WYKONAJ BEZPOŚREDNIO POLECENIE SQL..."
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP