Here is my solution for Firebird SQL using Common Table Expressions.
CREATE TABLE STACKOVERFLOW0001 (
ID INTEGER,
CATALOUGE INTEGER,
SWID INTEGER,
PARENTSWID INTEGER,
"LEVEL" INTEGER
);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (1, 1, 1, 1, 0);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (2, 1, 2, 1, 1);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (3, 1, 3, 1, 1);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (4, 1, 4, 2, 2);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (5, 1, 5, 4, 3);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (6, 1, 6, 5, 4);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (7, 2, 2, 2, 0);
INSERT INTO STACKOVERFLOW0001 (ID, CATALOUGE, SWID, PARENTSWID, "LEVEL")
VALUES (8, 2, 3, 2, 1);
COMMIT WORK;
Query
WITH RECURSIVE cat (id,catalouge,swid,parentswid,lvl)
as
(
select id,catalouge,swid,parentswid,"LEVEL" from stackoverflow0001 as r
where r."LEVEL" = 0 -- Magic Happens here for Filtering, you can specify the Start of the recursive tree walk down from here.
union all
select r.id, r.catalouge, r.swid, r.parentswid,r."LEVEL" from stackoverflow0001 as r,cat
where cat.swid = r.parentswid -- This is what matches up the first query record to the child records
and r."LEVEL" > 0 -- Just an additional filter check for child records.
)
select * from cat
// You can also stick some where clauses here if you need
Output
ID CATALOUGE SWID PARENTSWID LVL
1 1 1 1 0
2 1 2 1 1
4 1 4 2 2
5 1 5 4 3
6 1 6 5 4
8 2 3 2 1
3 1 3 1 1
7 2 2 2 0
4 1 4 2 2
5 1 5 4 3
6 1 6 5 4
8 2 3 2 1
8 2 3 2 1