Help on building up a Hierarchical Query

Hello
I have a requirement to build the approval group based on invoice amount on the invoice line in payable. For Example if the invoice line amount is 10000k then I want to send the invoice for approval till level 3 approval authority from the requester on the invoice line.. I have created a query as below and pas.person_id I am passing 62 (this is the person id of the requester on the invoice_line and approval starts from requester). By using this query i am getting the full approval hierarchical query from requester to CEO but i don't know how to restrict the records to fetch till approval hierarchy 3, in addition in case if I don't have any person for approval authority 3 then i should pick next immediate higher authority person (in this case 4)....Note: current requester don't have any approval authority and in case if the requester itself has approval authority 3 then  query should only return requester record.
Can anybody help me on this?
select
z.person_id,z.full_name,z.job_id, z.level1, pj.name,pj.approval_authority
from  PER_JOBS_VL pj,
(select distinct pp.person_id,pp.full_name, pas.job_id,LEVEL level1 from per_all_people_f pp,
  per_all_assignments_f pas
where pp.person_id= pas.person_id
start with pas.person_id = 62
connect by prior  pas.supervisor_id = pp.person_id
and trunc(sysdate) between trunc(pas.effective_start_date) and trunc(pas.effective_end_date)
and trunc(sysdate) between trunc(pas.effective_start_date) and trunc(pas.effective_end_date)
order by LEVEL )z
where pj.job_id = z.job_id
order by 4
PERSON_ID,FULL_NAME,JOB_ID,LEVEL1,JOB_NAME,APPROVAL_AUTHORITY
62,      aaa,       64,     1,     Buyer,
63,      bbb,       66,      2,    Director,  4
121,    ccc,       66,      3,    Director,  4
68,      ddd,      1296,   4,    CFO,       7
71,      eee,      1259,   5,    CEO,       7
Thanks!

Hi
Now I am trying to join more table to your query I am getting error. Can you please help..
Query I got from you
SELECT    person_id, full_name, job_id, level1, name, approval_authority
FROM
(    SELECT pp.person_id,
           pp.full_name,
           pas.job_id,
           LEVEL AS level1,
           pj.name,
           pj.approval_authority,
           ROW_NUMBER ()
              OVER (PARTITION BY pj.approval_authority ORDER BY ROWNUM)
              AS r_num
      FROM per_jobs_vl pj
           JOIN per_all_assignments_f pas
              ON pas.job_id = pj.job_id
           JOIN per_all_people_f pp
              ON pp.person_id = pas.person_id
where 1=1
and trunc(sysdate) between trunc(pas.effective_start_date) and trunc(pas.effective_end_date)
and trunc(sysdate) between trunc(pp.effective_start_date) and trunc(pp.effective_end_date)          
START WITH pas.person_id = 62
CONNECT BY PRIOR pas.supervisor_id = pp.person_id
           AND NVL (PRIOR pj.approval_authority, 0) <
                  :approval_authority_limit )
where r_num    = 1
ORDER BY  level1     
I modified to include more tables
SELECT    ail.invoice_id,ail.line_number,ail.amount,
person_id, full_name, job_id, level1, name, approval_authority
FROM
ap_invoice_lines_all ail, ap_invoice_distributions_all aid,
(    SELECT
--            ail.invoice_id,
  --          ail.line_number,
            pp.person_id,
           pp.full_name,
           pas.job_id,
           LEVEL AS level1,
           pj.name,
           pj.approval_authority,
           ROW_NUMBER ()
              OVER (PARTITION BY pj.approval_authority ORDER BY ROWNUM)
              AS r_num
      FROM per_jobs_vl pj,
              --ap_invoice_lines_all_temp ail1, ap_invoice_distributions_all_temp aid1,
            per_all_assignments_f pas,
            per_all_people_f pp
where 1=1
and pp.person_id = pas.person_id
and pas.job_id = pj.job_id
--and ail1.invoice_id = aid1.invoice_id
--and ail1.line_number = aid1.invoice_line_number
--and ail1.invoice_id = ail.invoice_id
---and ail1.line_number = ail.line_number
--and pp.person_id = ail.REQUESTER_ID --62
--and ail.invoice_id = 46044 and aid.invoice_line_number=1
and trunc(sysdate) between trunc(pas.effective_start_date) and trunc(pas.effective_end_date)
and trunc(sysdate) between trunc(pp.effective_start_date) and trunc(pp.effective_end_date)           
START WITH pas.person_id = 62--ail.REQUESTER_ID --62
--(select requeter_id from ap_invoice_lines_all_temp where invoice_id = ail.invoice_id and line_number = ail.line_number)
CONNECT BY PRIOR pas.supervisor_id = pp.person_id
           AND NVL (PRIOR pj.approval_authority, 0) <
                  :approval_authority_limit )
where r_num    = 1
and ail.invoice_id = aid.invoice_id
and ail.line_number = aid.invoice_line_number
and ail.amount >0
--and pp.person_id = ail.REQUESTER_ID --62
and ail.invoice_id = 46044 --and aid.invoice_line_number=1
ORDER BY  2,level1 
CREATE TABLE AP_INVOICE_LINES_ALL_TEMP
  INVOICE_ID                      NUMBER(15)    NOT NULL,
  LINE_NUMBER                     NUMBER        NOT NULL,
  LINE_TYPE_LOOKUP_CODE           VARCHAR2(25 BYTE) NOT NULL,
  REQUESTER_ID                    NUMBER(15),
  ORG_ID                          NUMBER(15)    DEFAULT NULL,
  AMOUNT                          NUMBER
SET DEFINE OFF;
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, REQUESTER_ID, ORG_ID, AMOUNT)
Values
   (46044, 1, 'ITEM', 62, 84,
    2500);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, REQUESTER_ID, ORG_ID, AMOUNT)
Values
   (46044, 2, 'MISCELLANEOUS', 6035, 84,
    300);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, REQUESTER_ID, ORG_ID, AMOUNT)
Values
   (46044, 3, 'FREIGHT', 1632, 84,
    200);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, ORG_ID, AMOUNT)
Values
   (46044, 4, 'TAX', 84, 0);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, ORG_ID, AMOUNT)
Values
   (46044, 5, 'TAX', 84, 0);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, ORG_ID, AMOUNT)
Values
   (46044, 6, 'ITEM', 84, 10000.02);
Insert into AP_INVOICE_LINES_ALL_TEMP
   (INVOICE_ID, LINE_NUMBER, LINE_TYPE_LOOKUP_CODE, REQUESTER_ID, ORG_ID, AMOUNT)
Values
   (46044, 7, 'ITEM', 6035, 84,
    25000.01);
COMMIT;
CREATE TABLE fnd_lookup_values_vl_temp
  LOOKUP_TYPE  VARCHAR2(25 BYTE) NOT NULL,
  ATTRIBUTE1                      VARCHAR2(25 BYTE) NOT NULL,
  ATTRIBUTE2                      VARCHAR2(25 BYTE) NOT NULL,
  ATTRIBUTE3                      VARCHAR2(25 BYTE) NOT NULL,
  ATTRIBUTE4                      VARCHAR2(25 BYTE) NOT NULL,
  ATTRIBUTE5                      VARCHAR2(25 BYTE) NOT NULL
SET DEFINE OFF;
Insert into APPS.fnd_lookup_values_vl_temp
   (LOOKUP_TYPE, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5)
Values
   ('DISTR_APRV_LVL', '84', '0', '10000', 'Inventory',
    '3');
Insert into APPS.fnd_lookup_values_vl_temp
   (LOOKUP_TYPE, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5)
Values
   ('DISTR_APRV_LVL', '84', '10000.01', '25000.00', 'Inventory',
    '4');
Insert into APPS.fnd_lookup_values_vl_temp
   (LOOKUP_TYPE, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5)
Values
   ('DISTR_APRV_LVL', '84', '25000.01', '50000.00', 'Inventory',
    '5');
COMMIT;
approval_authority_limit will be retried from the below query for each line (based on invoice line amount the approval authority will fetched from the below query)
select
flv.attribute5 from  ap_invoice_lines_all_temp ail,
fnd_lookup_values_vl_temp flv
where
flv.lookup_type = 'DISTR_APRV_LVL'
and flv.attribute1 = ail.org_id
and ail.amount between flv.attribute2 and flv.attribute3
and ail.invoice_id = 46044
--and ail.line_number=1
requester_id will be retried from the below query for each line
select requester_id from ap_invoice_lines_all_temp
where invoice_id = 46044
--and line_number = 1
My Expected results should be as follow (for line 1 and 7)
Invoice_id             Line_Number      Amount            person_id            job_id        level      Name   Apporval_authority
46044                           1                  2500                62                       64            1       Buyer             
46044                           1                  2500                63                       66            2       Director                4
46044                           7                  25000.01          62                       64            1       Buyer             
46044                           7                  25000.01          63                       66            2       Director                4
46044                           7                  25000.01          68                       1296         3      CFO                      7
Please help on this...
Thanks!

Similar Messages

  • [Oracle 8i] Need help pruning branches from a hierarchical query

    My problem is that my hierarchical query seems only to trim out the values that don't meet my criteria, but still includes their children. When my query hits a record that does not meet my criteria, I want it to stop there. I've tried including the criteria in just the 'where' clause of the query, and have also put the criteria in the 'connect by' clause as well, but nothing has fixed it. Please keep in mind I'm using Oracle 8i, so I can't use some of the 'nicer' statements for hierarchical queries that they introduced in 9. I'm stuck with 'Start With...Connect By'.
    I have sample tables/data that I can post if someone needs to see that to help me, but to start with, here's my current query:
    SELECT     *
    FROM     (
              SELECT
                   LEVEL
              ,     c_bill.comp_part_nbr                     AS     c_part_nbr
              ,     (select c_part.part_desc
                   FROM part c_part
                   WHERE c_part.part_nbr=c_bill.comp_part_nbr)     AS     c_part_desc
              ,     (SELECT c_part.part_type
                   FROM part c_part
                   WHERE c_part.part_nbr=c_bill.comp_part_nbr)      AS     c_part_type
              ,     c_bill.qty_per                          AS     c_qty_per_p
              ,     c_bill.qty_per_type                     AS     c_qty_per_type
              ,     (SELECT c_part.qty_on_hand                
                   FROM part c_part
                   WHERE c_part.part_nbr=c_bill.comp_part_nbr)      AS     c_qty_on_hand
              ,     c_bill.oper_nbr                     AS     rqd_at_op
              ,     c_bill.comp_off_adj                     AS     rqd_offset
              ,     c_bill.bom_doc_nbr                     AS     p_part_nbr
              ,     (SELECT p_part.qty_on_hand
                   FROM part p_part
                   WHERE p_part.part_nbr=c_bill.bom_doc_nbr)      AS     p_qty_on_hand
              FROM
                   BILL c_bill
              WHERE
                             (c_bill.status           =      'RL')           
                        AND     (c_bill.view_code     IN      ('M','G'))     
                        AND     (c_bill.end_eff_dt     >      SYSDATE)      
                        AND     (c_bill.begn_eff_dt     <=      SYSDATE)
              START WITH c_bill.bom_doc_nbr=RPAD(?,25)
              CONNECT BY PRIOR c_bill.comp_part_nbr=c_bill.bom_doc_nbr
              AND     c_bill.view_code     IN     ('M','G')     
              AND     c_bill.status          =     'RL'
              AND      c_bill.end_eff_dt     >     SYSDATE
              AND     c_bill.begn_eff_dt     <=     SYSDATE     
         ) a
    WHERE     c_part_type = 'M'

    The outside criterion of part_type='M' isn't my problem. Where I'm actually seeing my issue rear its ugly head is in the criterion:
    (c_bill.view_code     IN      ('M','G'))What I'll have happen is that one of the children or grandchildren of the part number I'm querying for (my parameter), will be of some view code that's not 'M' or 'G'. In my sample data below, I have a level 4 part that is part of the 'H' view code, which I don't want, nor do I want it's children. However, its child is in the 'G' view code, and my query returns it anyway.
    In my sample data below, I'm assuming that the parameter = 'XYZ-100'
    CREATE TABLE part
    part_nbr     varchar(25) not null,
    part_desc     varchar(25) not null,
    part_type     char(1) not null,
    qty_on_hand     double(13,4) not null
    CONSTRAINT part_pk
    PRIMARY KEY (part_nbr),
    CONSTRAINT check_part_type
    CHECK (part_type IN ('M','P','X','Y')),
    CONSTRAINT check_qty_on_hand
    CHECK (qty_on_hand >= 0)
    CREATE TABLE bill
    row_added_ts     char(20) not null,
    bom_doc_nbr     varchar(25) not null,
    comp_part_nbr     varchar(25) not null,
    qty_per          double(9,5) not null,
    qty_per_type     char(1) not null,
    oper_nbr     char(4) not null,
    comp_off_adj     double(3,0),
    status          char(2),
    view_code     char(1) not null,
    end_eff_dt     date() not null,
    begn_eff_dt     date() not null
    CONSTRAINT bill_pk
    PRIMARY KEY (row_added_ts),
    CONSTRAINT check_qty_per_type
    CHECK (qty_per_type IN ('0','1','2','3')),
    CONSTRAINT check_status
    CHECK (status IN ('IN', 'RL')),
    );     Values for those tables:
    INSERT INTO part
    VALUES ('xyz-1', 'purchased part', 'P', 5);
    INSERT INTO part
    VALUES ('xyz-2', 'purchased part', 'P', 1);
    INSERT INTO part
    VALUES ('xyz-3', 'purchased part', 'P', 1);
    INSERT INTO part
    VALUES ('xyz-3a', 'manufactured part', 'M', 1);
    INSERT INTO part
    VALUES ('xyz-4', 'purchased part', 'P', 1);
    INSERT INTO part
    VALUES ('xyz-9-1', 'manufactured part', 'M', 0);
    INSERT INTO part
    VALUES ('xyz-9a', 'manufactured part', 'M', 0);
    INSERT INTO part
    VALUES ('raw-1', 'purchased raw material', 'P', 212);
    INSERT INTO part
    VALUES ('raw-2', 'purchased raw material', 'P', 75.5);
    INSERT INTO part
    VALUES ('XYZ-100', 'manufactured part', 'M', 0);
    INSERT INTO part
    VALUES ('(OPEN)', '(not in use)', 'Y', 0);
    INSERT INTO part
    VALUES ('XYZ-100-1', 'manufactured part', 'M', 0);
    INSERT INTO part
    VALUES ('XYZ-100-2', 'manufactured part', 'M', 1);
    INSERT INTO part
    VALUES ('XYZ-100-3', 'manufactured part', 'M', 0);
    INSERT INTO part
    VALUES ('XYZ-100-4', 'manufactured part', 'M', 2);
    INSERT INTO part
    VALUES ('XYZ-100-A', 'manufactured part', 'M', 0);
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100','xyz-1',3,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100','XYZ-100-1',1,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-1','xyz-1',2,'1','****',1,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-1','XYZ-100-2',3,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-2','xyz-2',6,'1','****',2,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-2','xyz-4',6,'1','****',2,'IN','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-2','xyz-100-3',1,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-3','xyz-3',8,'1','****',1,'RL','M','01-Jan-2050','01-Jan-2000');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-3','xyz-3a',8,'1','****',1,'RL','M','01-Jan-2000','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-3','XYZ-100-4',4,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-3','XYZ-100-A',2,'1','****',2,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008071153100150000','XYZ-100-3','(OPEN)',2,'1','****',0,'RL','E','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008071153100150000','XYZ-100-3','xyz-9-1',2,'1','****',0,'RL','H','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-4','raw-1',8.75,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008072153100150000','XYZ-100-A','raw-2',3.75,'1','****',0,'RL','M','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008075911100150000','xyz-9-1','xyz-9a',1,'1','****',0,'RL','G','01-Jan-2050','01-Jan-1900');
    INSERT INTO bill
    VALUES ('2008087711100150000','xyz-9a','raw-2',3.75,'1','****',0,'RL','G','01-Jan-2050','01-Jan-1900');Sample data displayed in table format:
    --PART table (from insert statements above)
    part_nbr     part_desc          part_type     qty_on_hand
    xyz-1           purchased part          P          5
    xyz-2           purchased part          P          1
    xyz-3           purchased part          P          1
    xyz-3a           manufactured part     M          1
    xyz-4           purchased part          P          1
    xyz-9-1           manufactured part     M          0
    xyz-9a           manufactured part     M          0
    raw-1           purchased raw material     P          212
    raw-2           purchased raw material     P          75.5
    XYZ-100           manufactured part     M          0
    (OPEN)          (not in use)          Y          0
    XYZ-100-1     manufactured part     M          0
    XYZ-100-2     manufactured part     M          1
    XYZ-100-3     manufactured part     M          0
    XYZ-100-4     manufactured part     M          2
    XYZ-100-A     manufactured part     M          0
    --BILL table (from insert statements above)
    row_added_ts          bom_doc_nbr     comp_part_nbr     qty_per     qty_per_type     oper_nbr     comp_off_adj     status     view_code     end_eff_dt     begn_eff_dt
    2008072153100150000     XYZ-100          xyz-1          3     1          ****          0          RL     G          01-Jan-2050     01-Jan-1900
    2008072223100150000     XYZ-100          XYZ-100-1     1     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008072411100150000     XYZ-100-1     xyz-1          2     1          ****          1          RL     M          01-Jan-2050     01-Jan-1900
    2008072459100150000     XYZ-100-1     XYZ-100-2     3     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008072578100150000     XYZ-100-2     xyz-2          6     1          ****          2          RL     M          01-Jan-2050     01-Jan-1900
    2008072694100150000     XYZ-100-2     xyz-4          6     1          ****          2          IN     G          01-Jan-2050     01-Jan-1900
    2008072786100150000     XYZ-100-2     xyz-100-3     1     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008072865100150000     XYZ-100-3     xyz-3          8     1          ****          1          RL     M          01-Jan-2050     01-Jan-2000
    2008073100100150000     XYZ-100-3     xyz-3a          8     1          ****          1          RL     M          01-Jan-2000     01-Jan-1900
    2008073159100150000     XYZ-100-3     XYZ-100-4     4     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008073346100150000     XYZ-100-3     XYZ-100-A     2     1          ****          2          RL     M          01-Jan-2050     01-Jan-1900
    2008073478100150000     XYZ-100-3     (OPEN)          2     1          ****          0          RL     E          01-Jan-2050     01-Jan-1900
    2008073529100150000     XYZ-100-3     xyz-9-1          2     1          ****          0          RL     H          01-Jan-2050     01-Jan-1900
    2008073798100150000     XYZ-100-4     raw-1          8.75     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008073811100150000     XYZ-100-A     raw-2          3.75     1          ****          0          RL     M          01-Jan-2050     01-Jan-1900
    2008075911100150000     xyz-9-1          xyz-9a          1     1          ****          0          RL     G          01-Jan-2050     01-Jan-1900
    2008087711100150000     xyz-9a          raw-2          3.75     1          ****          0          RL     G          01-Jan-2050     01-Jan-1900--What I want to get with my query (branches pruned off my tree)
    LEVEL     C_PART_NBR     C_PART_DESC          C_PART_TYPE     C_QTY_PER_P     C_QTY_PER_TYPE     C_QTY_ON_HAND     RQD_AT_OP     RQD_OFFSET     P_PART_NBR     P_QTY_ON_HAND
    1     XYZ-100-1     manufactured part     M          1          1          0          ****          0          XYZ-100          0
    2     XYZ-100-2     manufactured part     M          3          1          1          ****          0          XYZ-100-1     0
    3     xyz-100-3     manufactured part     M          1          1          0          ****          0          XYZ-100-2     1
    4     XYZ-100-4     manufactured part     M          4          1          2          ****          0          XYZ-100-3     0
    4     XYZ-100-A     manufactured part     M          2          1          0          ****          2          XYZ-100-3     0--What I actually get with my query (includes children of items that don't meet query criteria)
    LEVEL     C_PART_NBR     C_PART_DESC          C_PART_TYPE     C_QTY_PER_P     C_QTY_PER_TYPE     C_QTY_ON_HAND     RQD_AT_OP     RQD_OFFSET     P_PART_NBR     P_QTY_ON_HAND
    1     XYZ-100-1     manufactured part     M          1          1          0          ****          0          XYZ-100          0
    2     XYZ-100-2     manufactured part     M          3          1          1          ****          0          XYZ-100-1     0
    3     xyz-100-3     manufactured part     M          1          1          0          ****          0          XYZ-100-2     1
    4     XYZ-100-4     manufactured part     M          4          1          2          ****          0          XYZ-100-3     0
    4     XYZ-100-A     manufactured part     M          2          1          0          ****          2          XYZ-100-3     0
    5     xyz-9a          manufactured part     M          1          1          0          ****          0          xyz-9-1          0Edited by: user11033437 on Jul 30, 2009 7:27 AM (grammar)

  • Help to generate totals in Hierarchical Query

    Hi Everyone,
    I've a small problem which I hope you might be able to help me with:
    I've the following 3 tables populated with sample data:
    --- Element_relation defines the hierarchical relationships ---
    create table element_relation (parent varchar2(10),child varchar2(10)) tablespace users;
    --- 'A' is the parent element with parent = 'NA' ---
    insert into element_relation values('NA','A');
    insert into element_relation values('A','B');
    insert into element_relation values('B','C');
    insert into element_relation values('C','D');
    --- 'B' is the parent element with parent = 'NA' ---
    insert into element_relation values('NA','A1');
    insert into element_relation values('A1','B1');
    insert into element_relation values('B1','C1');
    insert into element_relation values('C1','D1');
    --- invoice_detail has the invoice_no, element_id referencing the child column in element_relation column and its amount ---
    create table invoice_detail (invoice_no number,element_id varchar2(10),amount number) tablespace users;
    insert into invoice_detail values(1,'D',10);
    insert into invoice_detail values(2,'D1',20);
    insert into invoice_detail values(3,'B',20);
    --- invoice_header defines the invoice header and link to invoice_detail table ---
    create table invoice_header (invoice_no number,Invoice_description varchar2(20)) tablespace users;
    insert into invoice_header values(1,'AAA');
    insert into invoice_header values(2,'BBB');
    insert into invoice_header values(3,'CCC');
    My problem is I need to a build a query that will populate the following output:
    Invoice_no Element_id Total
    1 A 10
    1 B 10
    1 C 10
    1 D 10
    as well as the relevant output for Invoice_no 2 and 3. I managed to build the following SQL but it only works for one invoice_no at a time instead of traversing through all the invoice number in the invoice_header table. Here is the SQL statement that I've built:
    select a.invoice_no, b.child, sum(a.amount)
    from invoice_detail a,
    (select child from
    element_relation connect by child = prior parent start with child in
    (select element_id from invoice_detail where invoice_no = 1)) b
    where a.invoice_no = 1 and
    a.element_id in
    (select child from element_relation
    connect by prior child = parent
    start with child in b.child)
    group by a.invoice_no,b.child
    Any comment is much appreciated. Thank you for everyone's time spent on this issue.
    Regards,
    John

    Hello John, I put the (1,2,3) list in the query to show it works with multiple invoices.
    You should comment out the conditions:
    select a.invoice_no, b.child, sum(a.amount) from invoice_detail a,
    select
    child,
    decode (instr(scbp,'.'),0,scbp,
           substr(scbp, 1, instr(scbp,'.') -1)
           ) starting_child
    from (
    select ltrim(sys_connect_by_path(child,'.'),'.') scbp,
    child from
    element_relation
    start with child in (select element_id from invoice_detail /* where invoice_no in (1,2,3) */)
    connect by child = prior parent
    ) b
    where a.element_id = b.starting_child
    /* and a.invoice_no in (1,2,3) */
    group by a.invoice_no,b.child
    order by 1,2to show it works for all invoices
    regards, Tony

  • Hierarchical Query Help

    Version: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    Hello,
    I'm hoping I can get help with a Hierarchical Query.
    My base table contains Projects with a Group ID. Each Group can have the same Project Name so displaying the information in a Select List on an form for data entry can be very confusing. I'm hoping I can get a query that would produce the output below.
    Please let me know if I haven't provided the necessary information.
    The tables involved are:
    CREATE TABLE projects
      PROJECT_ID             NUMBER,
      PROJECT_NAME           VARCHAR2(100),
      GROUP_ID               NUMBER
    CREATE TABLE vertical_group
      GROUP_ID      NUMBER,
      GROUP_NAME    VARCHAR2(50)
    The data is:
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (1,'Proj Grp 1',1);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (2,'Proj Grp 1',1);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (3,'Proj Grp 1',1);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (4,'Proj Grp 1',1);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (5,'Proj Grp 1',1);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (6,'Proj Grp 2',2);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (7,'Proj Grp 2',2);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (8,'Proj Grp 2',2);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (9,'Proj Grp 2',2);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (10,'Proj Grp 3',3);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (11,'Proj Grp 3',3);
    INSERT INTO projects(project_id,project_name,group_id)
    VALUES (12,'Proj Grp 3',3);
    INSERT INTO vertical_group(group_id,group_name)
    VALUES (1,'Group 1');
    INSERT INTO vertical_group(group_id,group_name)
    VALUES (2,'Group 2');
    INSERT INTO vertical_group(group_id,group_name)
    VALUES (3,'Group 3');
    The desired output is:
    Group 1
        Proj Grp 1
        Proj Grp 1
        Proj Grp 1
        Proj Grp 1
        Proj Grp 1
    Group 2
        Proj Grp 2
        Proj Grp 2
        Proj Grp 2
        Proj Grp 2
    Group 3
        Proj Grp 3
        Proj Grp 3
        Proj Grp 3
    Thanks,
    Joe

    No hierarchical query is needed. Use UNION ALL and weights:
    with t as (
                select  'Group ' || group_id name,
                        group_id,
                        1 weight
                  from  projects
                  group by group_id
               union all
                select  '  ' || project_name,
                        group_id,
                        2 weight
                  from  projects
    select  name
      from  t
      order by group_id,
               weight,
               name
    NAME
    Group 1
      Proj Grp 1
      Proj Grp 1
      Proj Grp 1
      Proj Grp 1
      Proj Grp 1
    Group 2
      Proj Grp 2
      Proj Grp 2
      Proj Grp 2
      Proj Grp 2
    NAME
    Group 3
      Proj Grp 3
      Proj Grp 3
      Proj Grp 3
    15 rows selected.
    SQL>
    SY.

  • A help with a hierarchical query

    I've got two tables:
    FOLDERS where relevant fields are: folderId, parentFolderId, folderQuota
    and DOCUMENTS where the relevant fields are: folderId, size
    FOLDERS is hierarchical - parentFolderId of a child's folder is set to folderId of the parent
    folderQuota is nullable (quota not set)
    Now, I need to execute a query with the following recursive logic
    <i>function calcQuota (folderIdpar, isFirstpar) {
    if (not isFirstpar) and (folderQuota of folder with folderIdpar is not null) return folderQuota;
    return size of all documents where folderId = folderIdpar + calcQuota (folderId of all children, false);
    }</i>
    (I hope the pseudocode is understandable - the query is executed as <i>calcQuota(originalFolderId, true)</i>).
    Now, my question is if I can achieve it with a single hierarchical query, or if I have to implement it as a recursive stored procedure.
    Thanks!
    P.S. I'm using Oracle XE (10g)

    OK,
    I will need to create it (in real life it is created by an application), so I hope I will make it correct. If not, it should be easy to fix.
    create table folders (
    folder_id number primary key
    parent_folder_id number,
    quota number
    create table documents (
    document_id number primary key
    folder_id number,
    size number
    INSERT INTO folders (folder_id, quota) VALUES (1, 1);
    INSERT INTO folders (folder_id, parent_folder_id, quota) VALUES (2, 1, 2);
    INSERT INTO folders (folder_id, parent_folder_id) VALUES (3, 1);
    INSERT INTO folders (folder_id, parent_folder_id, quota) VALUES (4, 2, 4);
    INSERT INTO folders (folder_id, parent_folder_id) VALUES (5, 2);
    INSERT INTO folders (folder_id, parent_folder_id, quota) VALUES (6, 3, 8);
    INSERT INTO folders (folder_id, parent_folder_id) VALUES (7, 3);
    INSERT INTO documents (document_id, folder_id, size) VALUES (1, 1, 16);
    INSERT INTO documents (document_id, folder_id, size) VALUES (2, 2, 32);
    INSERT INTO documents (document_id, folder_id, size) VALUES (3, 3, 64);
    INSERT INTO documents (document_id, folder_id, size) VALUES (4, 3, 128);
    INSERT INTO documents (document_id, folder_id, size) VALUES (5, 4, 256);
    INSERT INTO documents (document_id, folder_id, size) VALUES (6, 5, 512);
    INSERT INTO documents (document_id, folder_id, size) VALUES (7, 6, 1024);
    INSERT INTO documents (document_id, folder_id, size) VALUES (8, 7, 2048);
    running the query for folder_id = 1 should return 1 + 2 + 64 + 128 + 8 + 2048 = 2251
    running the query for folder_id = 2 should return 4 + 512 = 516
    I have decided for this data, because it allows to track what values (folder.quota or document.size) is included in the result.
    (it is the knapsack problem - see http://en.wikipedia.org/wiki/Knapsack_problem)
    P.S. I'm leaving for three weeks, so I will come back after that.

  • Help for hierarchical query

    Hi all,
    I must be tired and cannot think clearly, so I'm a bit confused the following query.
    The environment is still Oracle 9i:
    Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
    PL/SQL Release 9.2.0.8.0 - Production
    CORE    9.2.0.8.0    Production
    TNS for HPUX: Version 9.2.0.8.0 - Production
    NLSRTL Version 9.2.0.8.0 - Production
    Suppose that I have the following data:
    with mydata as
       select 1 code, null code_high, 'John' cname, 'Smith'   csurname, 'X'   resp from dual union all
       select 2 code, 1    code_high, 'Bill' cname, 'White'   csurname, null  resp from dual union all
       select 3 code, 2    code_high, 'Fred' cname, 'Reed'    csurname, 'X'   resp from dual union all
       select 4 code, null code_high, 'Tim'  cname, 'Hackman' csurname, 'X'   resp from dual union all
       select 5 code, 4    code_high, 'John' cname, 'Reed'    csurname, null  resp from dual union all
       select 6 code, 5    code_high, 'Bill' cname, 'Hakcman' csurname, 'X'   resp from dual union all
       select 7 code, 6    code_high, 'Fred' cname, 'White'   csurname, null  resp from dual union all
       select 8 code, 7    code_high, 'Bill' cname, 'Smith'   csurname, null  resp from dual union all
       select 9 code, 8    code_high, 'Tom'  cname, 'Reed'    csurname, null  resp from dual
    select *
       from mydata;
          CODE  CODE_HIGH CNAME CSURNAME RESP
             1            John  Smith    X  
             2          1 Bill  White       
             3          2 Fred  Reed     X  
             4            Tim   Hackman  X  
             5          4 John  Reed        
             6          5 Bill  Hakcman  X  
             7          6 Fred  White       
             8          7 Bill  Smith       
             9          8 Tom   Reed        
    This is a hierarchical query where code_high represent the father.
    I need to find in the hierarchy the upper responsible level for each code.
    Suppose that I want to find in the hierarchy the first one having resp='X'.
    Running the following query I can find it for code = 9
    select code, cname, csurname
       from mydata
      where resp = 'X'
       and rownum = 1
    connect by prior code_high = code
      start with code = 9;
          CODE CNAME CSURNAME
             6 Bill  Hakcman
    Is there a way to get the whole list with the corresponding responsible.
    Here is the expected output:
          CODE  CODE_HIGH CNAME CSURNAME RESP RESP_CODE RESP_NAME RESP_SURNAME
             1            John  Smith    X            1 John      Smith  
             2          1 Bill  White                 1 John      Smith  
             3          2 Fred  Reed     X            3 Fred      Reed   
             4            Tim   Hackman  X            4 Tim       Hackman
             5          4 John  Smith                 4 Tim       Hackman
             6          5 Bill  Hakcman  X            6 Bill      Hakcman
             7          6 Fred  White                 6 Bill      Hakcman
             8          7 Bill  Smith                 6 Bill      Hakcman
             9          8 Tom   Reed                  6 Bill      Hakcman
    Regards.
    Alberto

    Hi Anar,
    check my post and my expected output.
    This is too simple and it is not what I need.
    Your code is showing this output:
            SS       CODE CNAME CSURNAME RESP
             1          1 John  Smith    X  
             1          3 Fred  Reed     X  
             1          4 Tim   Hackman  X  
             1          6 Bill  Hakcman  X  
    Actually the only way I have found (in Oracle 9i) is the following:
    select code, code_high, cname, csurname, resp
         , ( select code
               from mydata
              where resp='X'
                and rownum=1
            connect by prior code_high = code
            start with code=a.code
           ) resp_code
         , ( select cname
               from mydata
              where resp='X'
                and rownum=1
            connect by prior code_high = code
            start with code=a.code
           ) resp_name
         , ( select csurname
               from mydata
              where resp='X'
                and rownum=1
            connect by prior code_high = code
            start with code=a.code
           ) resp_surname
      from mydata a;
          CODE  CODE_HIGH CNAME CSURNAME RESP  RESP_CODE RESP_NAME RESP_SURNAME
             1            John  Smith    X             1 John      Smith      
             2          1 Bill  White                  1 John      Smith      
             3          2 Fred  Reed     X             3 Fred      Reed       
             4            Tim   Hackman  X             4 Tim       Hackman    
             5          4 John  Reed                   4 Tim       Hackman    
             6          5 Bill  Hakcman  X             6 Bill      Hakcman    
             7          6 Fred  White                  6 Bill      Hakcman    
             8          7 Bill  Smith                  6 Bill      Hakcman    
             9          8 Tom   Reed                   6 Bill      Hakcman    
    But I don't like this.
    Regards.
    Alberto

  • Hierarchical Query with Rollup Sum (CONNECT BY with GROUP BY ROLLUP)

    Hi all,
    Imagine the following scenario: i have an ACCOUNT table which holds accounts and their hierarchy (currently 5 levels), and a BALANCE table which holds balance records for the accounts. Only CHILD accounts (level 5) have records in the BALANCE table. Simple example:
    CREATE TABLE accounts (account_code VARCHAR2(30), parent_account VARCHAR2(30), account_desc VARCHAR2(400));
    CREATE TABLE balances (account_code VARCHAR2(30), balance_amount NUMBER(18,2));
    INSERT INTO ACCOUNTS VALUES ('TOT',NULL,'Total');
    INSERT INTO ACCOUNTS VALUES ('ANA1','TOT','General Expenses');
    INSERT INTO ACCOUNTS VALUES ('4801001','ANA1','Small Expenses');
    INSERT INTO ACCOUNTS VALUES ('4801002','ANA1','Transportation');
    INSERT INTO ACCOUNTS VALUES ('ANA2','TOT','Health Expenses');
    INSERT INTO ACCOUNTS VALUES ('4802001','ANA2','Healthcare');
    INSERT INTO ACCOUNTS VALUES ('4802002','ANA2','Facilities');
    INSERT INTO BALANCES VALUES ('4801001', 2000);
    INSERT INTO BALANCES VALUES ('4801002', 1000);
    INSERT INTO BALANCES VALUES ('4802001', 3000);
    INSERT INTO BALANCES VALUES ('4802002', 4000);What i need in this scenario is to run a hierarchical query, where for each node i compute the sum of all its children (In LEAF nodes which are the child accounts, this sum is the value in BALANCES itself). Final Result would be:
    TOT -> 10000
      ANA1 -> 3000
        4801001 -> 2000
        4801001 -> 1000
      ANA2 -> 7000
        4802001 -> 3000
        4802002 -> 4000I have tried various ways, and found out a workaround which works for a fixed amount of levels, basically it builds the hierarchy and computes the SYS_CONNECT_BY_PATH, then splits this as a regular expression and uses GROUP BY ROLLUP to compute the higher levels. Then i assemble it again, now with the computed values. Below is the example query:
    select level
        , NVL (vfinal.child_account,'TOTAL') ||' - '||
                            ( SELECT account_desc
                                FROM accounts
                               WHERE account_code = vfinal.child_acct ) account_name
         , to_char(sum_bal, 'fm999g999g999g990') as rolled_up_balance
      from
    select coalesce( princ.lvl3, princ.lvl2, princ.lvl1 ) child_acct
         , DECODE ( princ.lvl2 , NULL
                                     , NULL
                                     , DECODE ( princ.conta_lvl3, NULL
                                     , princ.conta_lvl1,princ.conta_lvl2 ) ) parent_acct
         , sum(princ.balance_amount) sum_bal
    from (
    select hier.lvl1
         , hier.lvl2
         , hier.lvl3
         , hier.parent_account
         , hier.account_code child_acc
         , bal.balance_amount
      from ( select level 
                  , sys_connect_by_path( account_code, '/' ) hierarchy_acct
                  , REGEXP_SUBSTR(sys_connect_by_path( account_code, '/' ),'[^/]+',1,3) lvl3
                  , REGEXP_SUBSTR(sys_connect_by_path( account_code, '/' ),'[^/]+',1,2) lvl2
                  , REGEXP_SUBSTR(sys_connect_by_path( account_code, '/' ),'[^/]+',1,1) lvl1
                  , account_code
                  , parent_account 
               from accounts acc
               where level <= 3
               start with parent_account is null
               connect by nocycle prior account = parent_account
               order siblings by parent_account
               ) hier
          , balances  bal
      where bal.cod_conta  = hier.account_code
    ) princ
    where princ.lvl1 is not null
    group by rollup ( princ.lvl1
                    , princ.lvl2
                    , princ.lvl3 )
    order by princ.conta_lvl1
           , princ.conta_lvl2
           , princ.conta_lvl3
    ) vfinal
    where child_acct is not null
    start with parent_acct is null
    connect by nocycle prior child_acct = parent_acctAll said and done, what i need is to do the same thing for infinite levels, because this query has 3 fixed levels. Do you know how can i structure a new query where, independently of the number of levels, the parent sums are all rolled up like this?
    Thanks a lot in advance! Best Regards!
    Thiago
    Edited by: Thiago on Sep 6, 2011 11:31 AM
    Edited by: Thiago on Sep 6, 2011 1:01 PM

    Hi,
    Thiago wrote:
    Hi all,
    Imagine the following scenario: i have an ACCOUNT table which holds accounts and their hierarchy (currently 5 levels), and a BALANCE table which holds balance records for the accounts. Only CHILD accounts (level 5) have records in the BALANCE table. Simple example:
    CREATE TABLE accounts (account_code VARCHAR2(30), parent_account VARCHAR2(30), account_desc VARCHAR2(400));
    CREATE TABLE balances (account_code VARCHAR2(30), balance_amount NUMBER(18,2));
    INSERT INTO ACCOUNTS ('TOT',NULL,'Total');
    INSERT INTO ACCOUNTS ('ANA1','TOT','General Expenses');
    INSERT INTO ACCOUNTS ('4801001','ANA1','Small Expenses');
    INSERT INTO ACCOUNTS ('4801002','ANA1','Transportation');
    INSERT INTO ACCOUNTS ('ANA2','TOT','Health Expenses');
    INSERT INTO ACCOUNTS ('4802001','ANA2','Healthcare');
    INSERT INTO ACCOUNTS ('4802002','ANA2','Facilities');
    INSERT INTO BALANCES ('4801001', 2000);
    INSERT INTO BALANCES ('4801001', 1000);
    INSERT INTO BALANCES ('4802001', 3000);
    INSERT INTO BALANCES ('4802001', 4000);
    Thanks for posting the CREATE TABLE and INSERT statements. Remember why you do it: so that the people who want to help you can re-create the problem and test their ideas. If the statments don't work, then they are not so useful. None of the INSERT statements you posted work: they all need a VALUES keyword. Please test those statments before you post them.
    Also, make sure that the reuslts you post correspond to the sample data you post. In your sample data, there are no rows in balances for account_codes '4801002' or '4802002'.
    I think you want something like this:
    WITH  connect_by_results      AS
         SELECT     CONNECT_BY_ROOT account_code     AS root_account_code
         ,     account_code
         FROM     accounts
                             -- NOTE: No START WITH clause
         CONNECT BY     parent_account     = PRIOR account_code
    SELECT       c.root_account_code     || ' -> '
                          || TO_CHAR (SUM (b.balance_amount))     AS txt
    FROM           connect_by_results  c
    LEFT OUTER JOIN      balances          b  ON  c.account_code = b.account_code
    GROUP BY  c.root_account_code
    ;

  • Hierarchical query with many-to-many relationship

    I have read with interest the creative solutions to complex hierarchical queries posted previously; they have been instructive but have not quite addressed this scenario.
    We have a hierarchy table H, with columns for ID, name, parentID, and other attributes.
    Within this table are a number of independent hierarchies, each existing for a different purpose.
    We have a master list of hierarchies in table T which describes the purpose of each hierarchy, provides some default attributes which the nodes can inherit, and stores a unique id for each hierarchy and a pointer to the root node of the corresponding hierarchy in table H.
    We have a master list of items M, with identically named columns to those in H, along with many other attributes.
    The members of table M ALL belong to EACH of the Hierarchies. So we have a link table I to define the intersection of H and M.
    So the leaf nodes of H are really containers for the list of elements from M which may be attached to them.
    The universe of M is very volatile, with new members being added, old ones deleted, and existing ones being reclassified frequently from node to node within each hierarchy. Since the hierarchies have to be built to handle every possible scenario, so that the members of M can always find a suitable node to reside in, quite often, in fact more often than not, the majority of leaf nodes for each hierarchy are empty at any given moment.
    Therefore, although we always know the root sector of a given hierarchy and can traverse downwards from there, if we worked our way up from the intersection table, we could eliminate up to 70% of the nodes of any given hierarchy from further consideration, as they don't need to be (in fact, must not be) included in reports.
    As implied by the above, rows in M are structurally similar (in terms of columns, but not in any real world sense) and are a superset of rows in H. But combining them into the one table doesn't seem to help the reporting process due to the many-to-many relationship which prevents the ID/parentID relationship from being carried through to this level.
    There are a number of other considerations of which the most pertinent is that the people using this database generally have an interest in only a subset of the master list of items in M. This relationship is also dynamic but important enough and rigid enough that another link table P exists to combine the Users in table U with the subset of M in which they are interested. (The users are also grouped into hierarchies of a totally different nature, but this aspect is secondary for now.)
    The reporting is reasonably straightforward for any single combination of User and Hierarchy; they want to see all the items they are interested in, listed in hierarchical sequence, totalled on change of level with the individual items M listed beneath the nodes of H. This is unfortunately required in real time, so retrieval performance is paramount.
    Some statistics might help to determine the optimum approach:
    The largest hierarchy has 10,000 nodes. The smallest about 100.
    The largest would have 70% or more of its nodes unused at any point in time, and even the smallest would have 25% unused.
    The hierarchies tend to be broad rather than deep, the maximum number of levels being about 5; but the larger ones should be twice as deep as this if performance was not compromised.
    There are dozens of hierarchies, but it may be possible to sharply reduce this number by exploiting the Order Siblings By clause.
    The number of rows in M varies between 500,000 and 50,000; depending upon how long historical data is retained on-line (and performance permitting, it would be retained indefinitely).
    The number of users varies between 1000 and 2000 but the range of M in which they are interested varies greatly; from as few as 100 to as many as 10,000+. So it is almost always worth beginning by eliminating the items in which they are not interested, implying once again that the hierarchy should be traversed upwards rather than down from the root.
    The current system is very old and survives by a tactic of building what are essentially materialised views of the database structure for each user overnight using, ahem, non-relational technology. This is inefficient and not easily scaled (but it works) and hence this redevelopment project needs to (a) work, and (b) work better and faster.
    I am happy to provide some DDL scripts if that helps explain the problem better than this narrative.
    I can't help feeling that the solution lies in somehow extending the hierarchical query past the many-to-many link table so that the Master list can be merged directly into the hierarchy such that the M items become the leaf nodes rather than the design outlined above - but I don't know how to do that. But I am sure everyone reading this does! :)
    All advice appreciated. Database version is not an issue; we are currently using version 10XE for experimentation, but production usage could be on 11 if that contains helpful features.
    Thank you
    CS

    Hi,
    ChrisS. wrote:
    I am happy to provide some DDL scripts if that helps explain the problem better than this narrative.Yes, please do.
    The problem seems interesting, I'm sure many people here (including myself) are willing to help you in this matter.
    So yes, post DDL for the tables, as well as INSERTs to populate them with representative data. Please also include the output you require along with detailed explanations about the logic to get it.
    Don't forget to put lines of code between &#x007B;code&#x007D; tags in order to preserve formatting and readability, like this :
    SELECT sysdate FROM dual;Thanks.

  • Building Cascading Lists for Query Screens with ADF Business Components.

    I build “Cascading Lists for Query Screens with ADF Business Components”. When I to select master list first working fine, but when I to select master list second returned error : JBO – 25013 : Too many objects match the primary key oracle.jbo.key[CN]. CN dependences with key to detail list (Countries in this case). Please help me.
    Andrew.

    You would have a better chance, that someone answers your question, if you choose the right forum:
    JDeveloper and ADF

  • Building Cascading Lists for Query with ADF Business components and JSP

    I build “Cascading Lists for Query Screens with ADF Business Components”. When I to select master list first – Ok, but when I to select master list second returned error : JBO – 25013 : Too many objects match the primary key oracle.jbo.key[CN]. CN dependences with key to detail list (Countries in this case). Please help me.
    Excuse me for my English.
    Andrew.

    You would have a better chance, that someone answers your question, if you choose the right forum:
    JDeveloper and ADF

  • Problem with Hierarchical query

    Gurus,
    I have a problem with hierarchical query, which I am pasting below.
    select sys_connect_by_path (Fname,'/')"PATH",Fname,id,level
    ,(SELECT COUNT(ID)-1 FROM (SELECT CONNECT_BY_ROOT LNAME LNAME,ID FROM CMT_PERSON
    START WITH ID = 'emplo000000000126009'
    CONNECT BY PRIOR ID=MANAGER_ID)
    GROUP BY FNAME)"COUNT"
    from CMT_PERSON
    WHERE
    LEVEL <= 4
    ----And ID='emplo000000000001877'
    CONNECT BY PRIOR id=manager_id
    ----AND NOT LEVEL > 3
    START WITH ID='emplo000000000126009'
    As per the result, count is getting repeated for all the levels. That is, count is coming 16100 for every level, Can you please help where exactly I am going wrong
    Regards

    You do not say anything about what count you want to get?
    A wild guess could be:
    select
       sys_connect_by_path (p1.fname, '/') "PATH",
       p1.fname,
       p1.id,
       level,
       (select count (id) - 1
        from
           (select connect_by_root p2.lname lname, p2.id
            from cmt_person p2
            start with p2.id = p1.id
            connect by prior p2.id = p2.manager_id)
        ) "COUNT"
    from cmt_person p1
    where level <= 4
    connect by prior p1.id = p1.manager_id
    start with p1.id = 'emplo000000000126009';Since your inner query simply starts with the hardcoded employee id, naturally it will give you the same count.
    My guess is your inner query should start with the person id from the outer query?
    If that is not the case - please state in plain english what you are trying to accomplish ;-)
    (Oh, and please paste code within tags so we can read it more easily...)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • Hierarchical query with where clause

    Hi,
    How can I query hierarchically a query with WHERE clause? I have a table with three fields session_id,id and root_id.
    When I try with the following query,
    select id, level from relation
    where session_id = 79977
    connect by prior id = root_id start with id = 5042;
    It gets duplicate values.
    I want the query to show in the hierarchical manner with a filter condition using WHERE clause. Please help me how can I achieve this. If you know any link that describes more about this, please send it.
    Thanks in Advance.
    Regards,
    -Parmy

    Hi Sridhar Murthy an others,
    Thanks a lot for your/the answer. It's working for me. It saved a lot of other work around without the proper knowledge of hierarchical query. Please send me any link that describes these issues in detail and also I hope as I have mentioned in the other message, same cannot be achieved on views or ( on two different tables ???)
    Any way thanks for your reply,
    It's working for me.
    With happiness,
    -Parmy

  • Hierarchical Query Duplication Issue

    Hi All,
    I am trying to create a tree structure for a "NOT SO" elegantly structured data(for tree type traversing). The below mentioned query is the sample of the data that I have in the real-time system.
    The assumption & requirements to be considered are as follows:
    1. The query with the rep data(i.e. first WITH clause query with 9 rows) is the master data that needs to be shown in hierarchical structure.
    2. The query with the group data is joined with the rep data on GROUP_ID to get the tree structure be traversing on group_id and PARENT_GROUP_ID(i.e. Second WITH clause query)
    The problem is I am getting 16 rows instead of 9(which are expected since the master rep data query has 9 rows). Some part of the Tress is getting wrongly duplicated.
    Can anybody please point to me where I am making any mistake in the way this hierarchical query is written.
    SELECT
      REP_EMAIL
    ,REP_TYPE
    ,GROUP_MGR_EMAIL
    ,GROUP_ID
    ,PARENT_GROUP_ID
    ,RPAD('*',LEVEL*10,'*')||REP_EMAIL REP_EMAIL
    -- ,RPAD('*',LEVEL*10,'*')||GROUP_MGR_EMAIL GROUP_MGR_EMAIL
    ,SYS_CONNECT_BY_PATH(REP_EMAIL, '/') "Path"
      FROM (
          SELECT * FROM (
                       WITH REP AS(
                                     SELECT '[email protected]' AS EMAIL, 'REP' AS REP_TYPE, 112 AS GROUP_ID, 112 AS PARENT_GROUP_ID FROM DUAL UNION
                                     SELECT '[email protected]', 'REP' , 112 , 112 FROM DUAL UNION
                                     SELECT '[email protected]', 'REP' , 115 , 115 FROM DUAL UNION
                                     SELECT '[email protected]', 'REP' , 115 , 115 FROM DUAL UNION
                                     SELECT '[email protected]', 'MGR' , 112 , 117  FROM DUAL UNION
                                     SELECT '[email protected]', 'MGR' , 115 , 119 FROM DUAL UNION
                                     SELECT '[email protected]', 'MGR' , 117 , 2 FROM DUAL UNION
                                     SELECT '[email protected]', 'MGR' , 119 , 2 FROM DUAL UNION
                                     SELECT '[email protected]', 'REP' , 115 , 115  FROM DUAL
                                     SELECT EMAIL AS REP_EMAIL, REP_TYPE, GROUP_ID AS REP_GROUP_ID, PARENT_GROUP_ID AS REP_PARENT_GROUP_ID
                                       FROM REP) REP
       JOIN (
             SELECT * FROM (
                         WITH GRP AS (
                                     SELECT 1 AS GROUP_ID, NULL AS PARENT_GROUP_ID, '[email protected]' AS GROUP_MGR_EMAIL FROM DUAL UNION
                                     SELECT 2 , 1 , '[email protected]' FROM DUAL UNION
                                     SELECT 50 , 2 , '[email protected]' FROM DUAL UNION
                                     SELECT 112 , 117 , '[email protected]' FROM DUAL UNION
                                     SELECT 115 , 119 , '[email protected]' FROM DUAL UNION
                                     SELECT 117 , 2 , '[email protected]' FROM DUAL UNION
                                     SELECT 119 , 2 , '[email protected]' FROM DUAL
                                    SELECT GROUP_ID,  PARENT_GROUP_ID, GROUP_MGR_EMAIL
                                      FROM GRP) GRP) GRP
       ON (REP.REP_PARENT_GROUP_ID = GRP.GROUP_ID))
        START WITH PARENT_GROUP_ID = 1
      CONNECT BY   PARENT_GROUP_ID = PRIOR GROUP_IDAny help would be really appreciated.
    Thank you,
    Warm Regards
    Goldi

    Goldi wrote:
    The problem is I am getting 16 rows instead of 9(which are expected since the master rep data query has 9 rows). Some part of the Tress is getting wrongly duplicated. I don't think it is getting wrongly duplicated...
    SQL> ed
    Wrote file afiedt.buf
      1  WITH REP AS (SELECT EMAIL AS REP_EMAIL, REP_TYPE, GROUP_ID AS REP_GROUP_ID, PARENT_GROUP_ID AS REP_PARENT_GROUP_ID
      2               FROM (
      3                     SELECT '[email protected]' AS EMAIL, 'REP' AS REP_TYPE, 112 AS GROUP_ID, 112 AS PARENT_GROUP_ID FROM DUAL UNION
      4                     SELECT '[email protected]'        , 'REP'            , 112            , 112            FROM DUAL UNION
      5                     SELECT '[email protected]'        , 'REP'            , 115            , 115            FROM DUAL UNION
      6                     SELECT '[email protected]'        , 'REP'            , 115            , 115            FROM DUAL UNION
      7                     SELECT '[email protected]'         , 'MGR'            , 112            , 117            FROM DUAL UNION
      8                     SELECT '[email protected]'        , 'MGR'            , 115            , 119            FROM DUAL UNION
      9                     SELECT '[email protected]'        , 'MGR'            , 117            , 2              FROM DUAL UNION
    10                     SELECT '[email protected]'        , 'MGR'            , 119            , 2              FROM DUAL UNION
    11                     SELECT '[email protected]'         , 'REP'            , 115            , 115            FROM DUAL
    12                    )
    13              )
    14      ,GRP AS (
    15               SELECT 1 AS GROUP_ID, NULL AS PARENT_GROUP_ID, '[email protected]' AS GROUP_MGR_EMAIL FROM DUAL UNION
    16               SELECT 2            , 1                      , '[email protected]'                   FROM DUAL UNION
    17               SELECT 50           , 2                      , '[email protected]'                   FROM DUAL UNION
    18               SELECT 112          , 117                    , '[email protected]'                     FROM DUAL UNION
    19               SELECT 115          , 119                    , '[email protected]'                    FROM DUAL UNION
    20               SELECT 117          , 2                      , '[email protected]'                    FROM DUAL UNION
    21               SELECT 119          , 2                      , '[email protected]'                    FROM DUAL
    22              )
    23  --
    24  SELECT REP_EMAIL
    25        ,REP_TYPE
    26        ,GROUP_MGR_EMAIL
    27        ,GROUP_ID
    28        ,PARENT_GROUP_ID
    29       -- ,RPAD('*',LEVEL*10,'*')||REP_EMAIL REP_EMAIL
    30       -- ,RPAD('*',LEVEL*10,'*')||GROUP_MGR_EMAIL GROUP_MGR_EMAIL
    31       -- ,SYS_CONNECT_BY_PATH(REP_EMAIL, '/') "Path"
    32  FROM   REP JOIN GRP ON (REP.REP_PARENT_GROUP_ID = GRP.GROUP_ID)
    33  --CONNECT BY PARENT_GROUP_ID = PRIOR GROUP_ID
    34* --START WITH PARENT_GROUP_ID = 1
    SQL> /
    REP_EMAIL                                                    REP GROUP_MGR_EMAIL     GROUP_ID PARENT_GROUP_ID
    [email protected]                                             REP [email protected]          112          117
    [email protected]                                             REP [email protected]         115          119
    [email protected]                                             REP [email protected]         115          119
    [email protected]                                              REP [email protected]          112          117
    [email protected]                                              REP [email protected]         115          119
    [email protected]                                             MGR [email protected]         119            2
    [email protected]                                             MGR [email protected]          2            1
    [email protected]                                             MGR [email protected]          2            1
    [email protected]                                              MGR [email protected]         117            2
    9 rows selected.There are multiple matches in REP for the parent group id's. e.g. xyz2@.. and xyz3@.. both have a parent of 2 so you'll get duplicated branches from that as the connect by is going on the group id's e.g.
    1
      2
         117
             112
             112
         119
             115
             115
             115
      2
         117
             112
             112
         119
             115
             115
             115The duplicates are caused by the rows in REP. So Oracle is doing what you are asking of it because there is nothing further to restrict the connection to make one branch of 2 unique from the other branch of 2

  • Problems with Views based on a Hierarchical Query

    Datamodeler 3.1.3.706 (SQL Dev 3.2.10.09):
    When creating a view that utilizes a Hierarchical Query, the Query Builder encounters various difficulties:
    When pasting in SQL code, if the view is saved without first clicking the update diagram button, the object in the view entity relationship diagram provides a faithful representation of the view without errors, but when reopening the view, the code is missing.
    Simple Example using the classic emp table:
    SELECT level lev
          , emp.*
       FROM emp
      CONNECT BY prior empno = mgr
      START WITH mgr        IS NULLIf the update diagram button is pushed to refresh the graphical view. It mangles the connect by clause and the view gets marked with a warning/error icon in the relationship diagram, but the now mangled code remains available on reopening the query builder.
    Same code as above after clicking the Update Diagram button:
    SELECT Level lev
    , emp.*
       FROM emp
      CONNECT BYFurther issues are encountered if the query contains any of the CONNECT_BY_% hierarchical pseudo columns:
    SELECT level
          , emp.*
          , connect_by_root emp.ename root_ename
       FROM emp
      CONNECT BY prior empno = mgr
      START WITH mgr        IS NULL;In this case pasting in the code and clicking either the Update Diagram button or the OK button results in an "Unexpected Token" parsing error.
    These issues are encountered with both the Logical and Relational models.
    Is this a known issue? I've searched this forum but haven't found any references to it.
    Thanks,
    Sentinel

    Hi Sentinel,
    I logged a bug for that.
    You can try DM 3.3 it deals better with first problem, parsing of connect_by_root operator will pass if you don't use alias.
    Philip

  • Joins in Hierarchical Query

    I'm trying to use a Hierarchical Query with table joins in the "FROM" clause. According to the documentation, this will work with Oracle 9i and above.
    My problem is that in some queries, using the "JOIN" syntax works correctly but in others, it gives an "ORA-00928" message.
    If I change the query that gives the error to use old style Oracle joins (using the where clause), the query works.
    Can anyone help me to identify the problem?

    Here's the query. Again, note that if I use the old oracle join syntax (using where clause) it works:
    select level
    , biu.parent_part_no
    , biu.parent_part_serial_no
    , biu.comp_part_qty
    , cpi.part_no
    , cpi.serial_number
    , cpi.trace_code
    from bom.bom_instance_usage biu
    join bom.bom_part_instance cpi
    on cpi.bom_part_instance_key = iu.comp_part_instance_key
    start with ( biu.parent_part_no = '123456'
    and biu.parent_part_serial_no = '114' )
    connect by ( biu.parent_part_no = prior cpi.part_no
    and biu.parent_part_serial_no = prior cpi.serial_number )

Maybe you are looking for

  • How do I integrate Apps into passbook?

    I don't understand how the passbook is supposed to work.  It seems like the app is just a connection to the app store.  I added the Starbucks app and then loaded my gift card into it.  It only shows up in the Starbucks app.  How does the Passbook app

  • Material To be Valuated in Project System

    Hi All, We are implementing PS,MM,SD,FI &CO for a companay which works essentially on engineer to order scenario and using vlauated projec stock & actvity account assigned networks Inhouse production is through typical assembly processing process - W

  • Change iten property when Add Row button pressed

    hi, I have advance table on one update page. There are two requirements on that page: 1. One key Item has to be READ_ONLY for saved rows. It can be changed when new row added using Add New Row button. I followed Changing UI properties (SPEL) example.

  • Php changing to php.html when opening in DW

    I got some files from another designer and the home page is index.php however, when I open it in dreamweaver, it changes the name to index.php.html. It also changes, ie it's no longer centered. I tried over and over to get it not to, but it keeps doi

  • WAd Report - How to change Cursor Type...

    Hi, In BI WAD report output, the cursor type is Pointer (Hand sign). I wanted to change it to some other type, is this possible, If yes, could u pls let how can i do that. I tried a lot but didn't suceed. Thanks...