Dvs. der kan være mange child's til hver parent og der kan være x niveauer mellem bund og top og dermed en skæv træ-struktur. (top værdien er altid kendt eller lig sig selv)
hvordan får jeg dem transponeret ud til (eller omvendt)
Jeg har prøvet med en sub-select, idet jeg kender top parent (værdien 1). Men det giver ikke helt det ønskede resultat og ser lidt underlig ud.
select child, parent from myData where parent in (select child from myData where parent in (select child from myData where parent in (select child from myData where parent in (select child from myData where parent = '5'))))
Hvordan løses dette ved kun at anvende SQL syntaks ?
CREATE TABLE tree ( id INTEGER, name VARCHAR2(50), parent INTEGER, PRIMARY KEY (id) ); INSERT INTO tree VALUES (0, 'root', NULL); INSERT INTO tree VALUES (1, 'A', 0); INSERT INTO tree VALUES (2, 'B', 0); INSERT INTO tree VALUES (3, 'AA', 1); INSERT INTO tree VALUES (4, 'AB', 1); INSERT INTO tree VALUES (5, 'BA', 2); INSERT INTO tree VALUES (6, 'BB', 2); INSERT INTO tree VALUES (7, 'AAA', 3); INSERT INTO tree VALUES (8, 'AAAA', 7); SELECT t1.id c,t2.id p FROM tree t1,tree t2 WHERE t2.id IN (SELECT id FROM tree START WITH id = t1.parent CONNECT BY PRIOR parent = id) ORDER BY c,p DESC;
som jeg håber du kan se ligner noget - det er dog kun i 2 søjler men dit variabel antal kolonner output er SQL'sk og ovenstående query resultat kunne nemt formateres af et program til at se ud som det du ønsker
Tak for det, jeg må se om jeg kan finde en Oracle eller anden DB der understøtter START WITH id = t1.parent CONNECT BY PRIOR parent = id - måske kan det anvendes i DB2 ?
Som du skriver kan outputtet nu nemmere transponeres til mit absolut ikke-relationelle output.
Jeg er godt klar over, at sagen er gammel, men jeg syntes alligevel den så så spændende ud, at jeg ikke ku' dy mig. Efter et par forsøg kom jeg frem til følgende enkle sætning:
select pc1.parent as a, pc1.child as b, pc2.child as c, pc3.child as d, pc4.child as e, pc5.child as f, pc6.child as g, pc7.child as h from parentchild pc1 left join parentchild pc2 on pc1.child=pc2.parent and pc2.parent<>pc2.child left join parentchild pc3 on pc2.child=pc3.parent and pc3.parent<>pc3.child left join parentchild pc4 on pc3.child=pc4.parent and pc4.parent<>pc4.child left join parentchild pc5 on pc4.child=pc5.parent and pc5.parent<>pc5.child left join parentchild pc6 on pc5.child=pc6.parent and pc6.parent<>pc6.child left join parentchild pc7 on pc6.child=pc7.parent and pc7.parent<>pc7.child where pc1.parent=5
Hvis jeg ellers har forstået spørgsmålet (hvilket på ingen måde ikke er givet! ;-) skulle den løse opgaven. Men!, den returnerer to records (hvilket jeg, i min naivitet også må tilstå, at jeg synes dine testdata lægger op til). Hvis det er forkert, så vil jeg (hvis du stadig har interesse i problemet, naturligvis - ingen tvang her) gerne høre en forklaring på hvorfor det er forkert. Jeg er godt klar over, at en sådan løsning ikke er optimal, da man er nødt til at definere en max. dybde. Til gengæld vil den kunne bruges i alle databaser. Endnu en gang forudsat at resultatet er rigtigt, naturligvis.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.