Hirdetés

Új hozzászólás Aktív témák

  • bpx

    őstag

    válasz DopeBob #2511 üzenetére

    MySQL-es példát mutatsz, de CONNECT BY-t szeretnél használni, ami az "igazi" Oracle-ben van, MySQL-ben nincs, így maradjunk az Oracle-nél. A példádat kicsit kiegészítettem, mert ha csak két szintes a hierarchia, akkor túl triviális, még CONNECT BY sem kell.

    create table table1 (id varchar2(10), part varchar2(100), qty int);
    insert into table1 (id, part, qty) values ('1', '1--1', 2);
    insert into table1 (id, part, qty) values ('1', '1--2', 4);
    insert into table1 (id, part, qty) values ('1', '1--3', 8);
    insert into table1 (id, part, qty) values ('1', '1--4', 5);
    insert into table1 (id, part, qty) values ('1--1', '1--1--1', 2);
    insert into table1 (id, part, qty) values ('1--1', '1--1--2', 2);
    insert into table1 (id, part, qty) values ('1--1', '1--1--3', 2);
    insert into table1 (id, part, qty) values ('1--2', '1--2--1', 2);
    insert into table1 (id, part, qty) values ('1--3', '1--3--1', 2);
    insert into table1 (id, part, qty) values ('1--4', '1--4--1', 3);
    insert into table1 (id, part, qty) values ('1--4--1', '1--4--1--1', 7);
    commit;

    Lekérdezés + eredmény:

    select id, part, qty,
    (select exp(sum(ln(t2.qty)))
    from table1 t2
    start with t2.id = t1.id and t2.part = t1.part
    connect by prior id = part
    ) mqty
    from table1 t1
    start with id = '1'
    connect by id = prior part;

    ID PART QTY MQTY
    ---------- -------------------- ---------- ----------
    1 1--1 2 2
    1--1 1--1--1 2 4
    1--1 1--1--2 2 4
    1--1 1--1--3 2 4
    1 1--2 4 4
    1--2 1--2--1 2 8
    1 1--3 8 8
    1--3 1--3--1 2 16
    1 1--4 5 5
    1--4 1--4--1 3 15
    1--4--1 1--4--1--1 7 105

    Ha csak azok érdekelnek, amelyek a hierarchia utolsó szintjén vannak:

    select id, part, qty, mqty from (
    select id, part, qty,
    (select exp(sum(ln(t2.qty)))
    from table1 t2
    start with t2.id = t1.id and t2.part = t1.part
    connect by prior id = part
    ) mqty,
    connect_by_isleaf leaf
    from table1 t1
    start with id = '1'
    connect by id = prior part)
    where leaf = 1;

    ID PART QTY MQTY
    ---------- -------------------- ---------- ----------
    1--1 1--1--1 2 4
    1--1 1--1--2 2 4
    1--1 1--1--3 2 4
    1--2 1--2--1 2 8
    1--3 1--3--1 2 16
    1--4--1 1--4--1--1 7 105

Új hozzászólás Aktív témák