Help in hierarchical query
HelloI have data like this.
EMPID ENAME MANAGERID
1A
2 1
1 OF 3
4 2
5 2
6 3
4 OF 7
And I want to show the data in this way. SUPERMNAGERID is always 1, regardless of the fact that that which is his immediate superior.
EMPID ENAME MANAGERID SUPERMNAGERID
1A
2-1-1
3-1-1
4-2-1
5-2-1
6-3-1
7-4-1
Your help on this would be really useful.
Edited by: user10827825 may 6, 2012 12:36
Most inefficient way. If you want to use a hierarchical query, use START WITH and to get the "supermanager" use CONNECT_BY_ROOT:
WITH t AS
(SELECT 1 EMPID, 'A' ENAME, NULL MANAGER_ID
FROM DUAL
UNION ALL
SELECT 2 EMPID, 'B' ENAME, 1 MANAGER_ID
FROM DUAL
UNION ALL
SELECT 3 EMPID, 'C' ENAME, 1 MANAGER_ID
FROM DUAL
UNION ALL
SELECT 4 EMPID, 'D' ENAME, 2 MANAGER_ID
FROM DUAL
UNION ALL
SELECT 5 EMPID, 'E' ENAME, 2 MANAGER_ID
FROM DUAL
UNION ALL
SELECT 6 EMPID, 'F' ENAME, 3 MANAGER_ID
FROM DUAL
UNION ALL
SELECT 7 EMPID, 'G' ENAME, 4 MANAGER_ID
FROM DUAL
)
SELECT EMPID, ENAME, MANAGER_ID, CONNECT_BY_ROOT EMPID
FROM t
START WITH MANAGER_ID IS NULL
CONNECT BY MANAGER_ID = PRIOR EMPID
ORDER BY EMPID;
Compare the number of lines hierarchy is generated by bot queries:
SQL> WITH t AS
2 (SELECT 1 EMPID, 'A' ENAME, NULL MANAGER_ID
3 FROM DUAL
4 UNION ALL
5 SELECT 2 EMPID, 'B' ENAME, 1 MANAGER_ID
6 FROM DUAL
7 UNION ALL
8 SELECT 3 EMPID, 'C' ENAME, 1 MANAGER_ID
9 FROM DUAL
10 UNION ALL
11 SELECT 4 EMPID, 'D' ENAME, 2 MANAGER_ID
12 FROM DUAL
13 UNION ALL
14 SELECT 5 EMPID, 'E' ENAME, 2 MANAGER_ID
15 FROM DUAL
16 UNION ALL
17 SELECT 6 EMPID, 'F' ENAME, 3 MANAGER_ID
18 FROM DUAL
19 UNION ALL
20 SELECT 7 EMPID, 'G' ENAME, 4 MANAGER_ID
21 FROM DUAL
22 )
23 SELECT count(*)
24 FROM t
25 CONNECT BY PRIOR MANAGER_ID = EMPID
26 ORDER BY EMPID;
COUNT(*)
----------
18
SQL> WITH t AS
2 (SELECT 1 EMPID, 'A' ENAME, NULL MANAGER_ID
3 FROM DUAL
4 UNION ALL
5 SELECT 2 EMPID, 'B' ENAME, 1 MANAGER_ID
6 FROM DUAL
7 UNION ALL
8 SELECT 3 EMPID, 'C' ENAME, 1 MANAGER_ID
9 FROM DUAL
10 UNION ALL
11 SELECT 4 EMPID, 'D' ENAME, 2 MANAGER_ID
12 FROM DUAL
13 UNION ALL
14 SELECT 5 EMPID, 'E' ENAME, 2 MANAGER_ID
15 FROM DUAL
16 UNION ALL
17 SELECT 6 EMPID, 'F' ENAME, 3 MANAGER_ID
18 FROM DUAL
19 UNION ALL
20 SELECT 7 EMPID, 'G' ENAME, 4 MANAGER_ID
21 FROM DUAL
22 )
23 SELECT count(*)
24 FROM t
25 START WITH MANAGER_ID IS NULL
26 CONNECT BY MANAGER_ID = PRIOR EMPID
27 ORDER BY EMPID;
COUNT(*)
----------
7
SQL>
Now imagine the table real a couple thousand lines.
SY.
Tags: Database
Similar Questions
-
I'm trying to parse each string inside of individual characters. For this, I used the link by the hierarchical query clause. I am not able to use connect by correctly. Here is my example.
with the CBC as)
Select 1: the nurse, 'abc' double union all Str
Select 2: the nurse, '123' Str of all union double
Select 3: the nurse, "pqr xyz" dual union all Str
Select option 4: the nurse, 'john doe' double Str
)
Select the level, homobasidiomycetes, substr(s.str,level,1) as chr
s of the CBC
connect nocycle level < = length (homobasidiomycetes)
/
The above query returns 3 028 lines when I want that 21. Adding a distinct to select, it's what I want.
with the CBC as)
Select 1: the nurse, 'abc' double union all Str
Select 2: the nurse, '123' Str of all union double
Select 3: the nurse, "pqr xyz" dual union all Str
Select option 4: the nurse, 'john doe' double Str
)
Select distinct level, homobasidiomycetes, substr(s.str,level,1) as chr
s of the CBC
connect nocycle level < = length (homobasidiomycetes)
order by str, level
/
For a large data set I could end up with several million rows before the separate would lead. So, how can I restrict the connection by clause to go within each line.
Assuming that the AI is the primary key, you could do this:
with src as ( select 1 as rn, 'abc' as str from dual union all select 2 as rn, '123' as str from dual union all select 3 as rn, 'pqr xyz' as str from dual union all select 4 as rn, 'john doe' as str from dual ) select level, s.str, substr(s.str,level,1) as chr from src s connect by level <= length(s.str) and prior rn = rn and prior dbms_random.value is not null;
See DBMS_RANDOM.value in a hierarchical solution for string to table? for an exchange of views around the case.
-
Need help with hierarchical query
I have a table as below by indicating the columns id and parent_id.
ID parent_id
--- --------
1
2 1
5 t
4 2
5
6 5
6 of 7
Need lower o/p.
ID parent_id
--- ---------
4 2
4 1
6 of 7
5 of 7
Thus, the node of the hierarchical values worksheet must be kept in the value of the ID.
Thank you!
Hello
One way is a request to CONNECT BY Bottom-Up :
ID CONNECT_BY_ROOT SELECT ID
parent_id
TEMP
WHERE parent_id IS NOT NULL
START WITH id NOT IN)
SELECT parent_id
TEMP
WHERE parent_id IS NOT NULL
)
CONNECT BY id = parent_id PRIOR
;
Top-Down CONNECT BY queries, where you start with the roots and then to find children, are more common, only because they are appropriate for most problems. Queries from the bottom to the top, where you start with leaves and then will find relatives, are equally valid and work the same way.
-
[Oracle 8i] Need help of a hierarchical query pruning branches
My problem is that my hierarchical query seems only to cut values that do not 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 tried including the criteria in just the ' ' a where clause of the query and also put the criteria in clause "connect by" as well, but nothing has been set. Will you please keep in mind that I'm using Oracle 8i, so I can't use some of the "nice" statements for hierarchical queries that they introduced in 9. I'm stuck with "Start With... Connect in "."
I have examples of tables/data I can post if someone needs to see to help me, but to start with, here 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'
Hello
The criterion in the outer query
c_part_type = 'M'
applies only to the results; You can still get the descendants of these lines in the output. This seems to be the only thing that is not repeated in the CONNECT BY clause.
If you don't want to repeat the criteria in the WHERE clause and the CONECT BY clause, you can apply them once in a view online.
The following example works in Oracle 8.1:SELECT LPAD ( ' ' , 3 * (LEVEL - 1) ) || ename AS iname , empno , mgr FROM ( -- Begin in-line view of employees named C-Z SELECT ename , empno , mgr FROM scott.emp WHERE ename >= 'C' ) -- End in-line view of employees named C-Z START WITH mgr IS NULL CONNECT BY mgr = PRIOR empno ;
Not only is excluded BLAKE, but the descendants of JAMES BLAKE, MARTIN, etc. are excluded, too, without repeating the condition.
Please, post CREATE TABLE and INSERT statements for some examples of data - just enough to show what is the problem - and the results desired from these data.
-
Version: Oracle Database 11 g Enterprise Edition Release 11.2.0.2.0 - 64 bit Production
Hello
I can't just writing this hierarchical query.
CREATE TABLE resources ( resource_name VARCHAR2( 20 ) ,resource_id NUMBER ,resource_mgr_id NUMBER ); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Phupinder',29269,29298); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Terry',29298,NULL); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Matt',4876,32942); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Bryan',29429,29269); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Cathy',32942,4922); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Scott',4257,29429); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Joe',44026,4876); INSERT INTO resources(resource_name,resource_id,resource_mgr_id) VALUES ('Greg',4922,4257);
-
Hierarchical query help need to Oracle
Hello
I'm in a deep trouble.
I want to do a hierarchical query in my TreeView table in oracle. But I want that the query retrieves information path between two nodes.
Review the table below.
------------------------------------------------------
Node ID | Name of the node. ID of the parent
-----------------------------------------------------
1A 0
2 1
3C0
4 2
-----------------------------------------------------
What I want is that I'll give you 2 node id in the request. One is the source node and the other is the destination node.
so if I put 1 node and node 4, I want to be the output
1-> 2-> 4
I want just a return line. Or there may be several rows but stands only the node of this path.
1
2
4
----
This means that I don't want to node 3 in the search result.
More if I have the source as 4 node and the node of destination as 1 then I will also get an output of the query as below-
4-> 2-> 1
This means that the search for the query for the result in a way directional bi.
If anyone can give me some information about who it's going to be great for me.
Published by: user13276471 on December 31, 2012 03:21Hello
Welcome to the forum!
Assuming you have 2 separate nodes: Node_A and: node_b, you can find the hierarchy from one to the other like this:
SELECT SYS_CONNECT_BY_PATH (node_id, ',') AS lineage FROM table_x WHERE node_id IN (:node_a, :node_b) AND LEVEL > 1 START WITH node_id IN (:node_a, :node_b) CONNECT BY parent_id = PRIOR node_id ;
It will work if: the Node_A is an ancestor of the: node_b, or if: node_b is an ancestor of the: Node_A.
If is the ancestor of the other, then it will produce 0 rows. -
I have two tables:
The FOLDERS where the areas concerned are: folderId, parentFolderId, folderQuota
and DOCUMENTS where the areas concerned are: folderId, size
FILES is hierarchical - parentFolderId of the file of the child has the folderId of the parent value
folderQuota the value null (undefined quota)
Now, I need to run a query with the following recursive logic
< i > function calcQuota (folderIdpar, isFirstpar) {}
If (not isFirstpar) and (folderQuota of the folder with folderIdpar is not null) return folderQuota;
Returns the size of all documents where folderId = folderIdpar + calcQuota (folderId of all children, false);
} < /i >
(I hope the pseudo-code is understandable - the query is executed as < i > calcQuota (originalFolderId, true) < /i >).
Now, my question is if I can accomplish this with a single hierarchical query, or if I should implement as a recursive procedure stored.
Thank you!
P.S. I use Oracle XE (10g)Hello
If you want to ignore the quotas at the level = 1:
WITH tree AS ( SELECT folder_id , CASE WHEN LEVEL > 1 THEN quota END AS effective_quota FROM folders f START WITH folder_id = :start_folder_id CONNECT BY parent_folder_id = PRIOR folder_id AND ( PRIOR quota IS NULL OR LEVEL = 2 ) ) SELECT :start_folder_id , SUM ( NVL ( t.effective_quota , d.document_size ) ) AS total_size FROM tree t LEFT OUTER JOIN documents d ON t.folder_id = d.folder_id AND t.effective_quota IS NULL ;
-
Hierarchical data, how to aggregate over levels in hierarchical query?
Hello
I hope someone can help me.
I held in a data table ("" what part was built in what other part of when when? "')
ID parent_id build_in build_out
1 NULL NULL NULL
2/1 2010 2012
3 2 2011 2013
4 2 2013 NULL
What are the parts is stored in a separate table.
Now I want to know when when which part was built in the first level, in the example, I want to know that
1 was simply a part of 1
2 was part of 1 between 2010 and 2012
3 was part of 1 between 2011 and 2012
4 has never been a part of 1
I tried several approaches - if there is a fixed number of levels between the types, I am interested I can do using joins and more/less (similarly as some nvl). Unfortunately this is not always the case (some parts appear on several levels).
If I'm only interested in the parts that are never deleted, I can get by using a style of connect request and get the current configuration. But I can't seem to understand the time connecting part to the high level in such a query, or even filtering absurd combinations (like "4 in 1" in the example above). I could deal with the data recovered outside the database, but I prefer not.
Is there a way to obtain the hierarchical data with an aggregate (min, max) for all levels?What version of Oracle you are on?
In 11.2.x, you can use the recursive subquery factoring. Something like
with t (id, parent_id, build_in, build_out) as ( select 1, null, null, null from dual union all select 2, 1, 2010, 2012 from dual union all select 3, 2, 2011, 2013 from dual union all select 4, 2, 2013, null from dual ) , c1 (root_id, id, parent_id, build_in, build_out) as ( select id, id, parent_id, 0, 9999 from t where parent_id is null union all select root_id, t.id, t.parent_id , greatest(nvl(t.build_in,0), nvl(b.build_in,0)) , least(nvl(t.build_out,9999), nvl(b.build_out,9999)) from c1 b, t where b.id = t.parent_id ) select * from c1 where build_in < build_out ; ROOT_ID ID PARENT_ID BUILD_IN BUILD_OUT ------- ----- ---------- --------- ---------- 1 1 0 9999 1 2 1 2010 2012 1 3 2 2011 2012
With a hierarchical query by using the syntax connection, you could do something like
select * from ( select connect_by_root id as root, id , greatest(nvl(build_in,0), nvl(prior build_in,0)) as max_in, least(nvl(build_out,9999), nvl(prior build_out,9999)) as min_out from t start with parent_id is null connect by parent_id = prior id ) where max_in < min_out ;
but it is not powerful enough. This version compares the dates between a current and previous levels, but the recursive subquery is to compare the dates in the current level for the winners of the comparisons to the previous level. Not sure if it's an important distinction for your needs, however.
If you are on 11.2 I advise to use the recursive subquery factoring. If this isn't the case, you can try the link by version.
Kind regards
Bob -
Get the value of the root of a hierarchical query
I'm writing a hierarchical query for one of my paintings.
I need to know the value of the root by entering a value of sheet of any level.
for example: I enter a value which is at level 4. I need to find the value of the root without displaying the other levels.
Help, please.
Thank you.TRY THIS,
SELECT ename, PRIOR ename MGRNAME FROM emp WHERE ename = START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr
Published by: NSK2KSN on August 9, 2010 18:10
-
Query on hierarchical query in interactive report!
Hello
In Apex Oracle 5.1, I tried to use an interactive report to view details of employee based on a hierarchy. I used the query to display data below:
SELECT last_name, employe_id, manager_id, LEVEL
Employees
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id
Brothers and SŒURS of ORDER BY last_name;
The output was as below:
LAST_NAME EMPLOYEE_ID MANAGER_ID LEVEL
------------------------- ----------- ---------- ----------
King 100 1
Cambrault 148 100 2
Bates 172 148 3
Bloom 169 148 3
Fox 170 148 3
Kumar 173 148 3
Ozer 168 148 3
Smith 171 148 3
De Haan 102 100 2
Hunold 103 102 3
Austin 105 103 4
Ernst 104 103 4
Lorentz 107 103 4
Pataballa 106 103 4
Errazuriz 147 100 2
Ande 166 147 3
Banda 167 147 3
...
Now, I would like to display data based on the connection of employees.
For example (based on above request): If an employee named - Cambrault is the login, only employees under him (Bates, Bloom, Fox, Kumar, Smith, Ozer) and its own contact information should appear in the report.
Please advise.
Kind regards
mebu
Mebu wrote:
I used a hierarchical query. But based on Login, I want to display only members under him.
For example: If Cambrault LOGIN, only employees under him (Bates, Bloom, Fox, Kumar, Smith, Ozer) and its own coordinates must display in Oracle Apex.
SELECT last_name, employe_id, manager_id, LEVEL
Employees
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id
Brothers and SŒURS of ORDER BY last_name;
See what/when/where? How to get the answers from the forum
Describe the requirements clearly and completely, using the APEX, Oracle and terminology of web standard.
-
hierarchical query of VO in the ofa page
Hello
I try to use the hierarchical query in VO for the display of all levels of supervisors for employee and want to display in populist:
This is the query
REPLACE SELECT distinct (mgx.full_name, "',' ') supervisor_full_name;
XPP. Employee_number
OF per_assignments_x pax,.
per_people_x ppx,
per_people_x mgx,
per_positions pp,
per_jobs pj,
per_position_definitions ppd
WHERE ppx.person_id = pax.person_id
AND ppx.current_employee_flag = 'Y '.
AND mgx.person_id = pax.supervisor_id
AND pp.position_id = pax.position_id
AND pj.job_id = pax.job_id
AND ppd.position_definition_id = pp.position_definition_id
START WITH ppx.employee_number =: 1
CONNECT BY PRIOR MGX.employee_number = ppx.employee_number AND LEVEL < 6
I'm trying to get this VO implemented PR when I run the page in jdeveloper with parameter binding, it's getting error.
oracle.apps.fnd.framework.OAException: oracle.jbo.SQLStmtException: 27122 Houston: SQL error in the preparation of the statement.
I would like to delete the parameter binding and executing CO VO past these two statements may be:
START WITH ppx.employee_number =: 1
CONNECT BY PRIOR MGX.employee_number = ppx.employee_number AND LEVEL < 6
How can I do?
Thank you
MK
has worked?
-
Oracle Version: 11.2.0.2.0
I need assistance with the output of the query. Here is the table.
With Tbl_Nm as
(
Select 'ABC1' SYSTEM_ID, REGION 'US', 'CHI' SUB_REGION 4000 BALANCE, to_date('1-JUN-2012 10:45:00 am', 'dd-mon-yyyy hh:mi:ss am') LAST_UPD_TIME, 'A' FLAG of union double all the
Select 'PQR2', 'UK', 'LN', 2000, To_Date('1-JUL-2012 10:46:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' starting from dual Union All
Select 'ABC1', 'IND","MAMA", 3500, To_Date('1-AUG-2012 11:47:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select "LMN3", "US", "NJ", 2500, To_Date('1-SEP-2012 09:49:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select "PQR2", "UK", "MC", 2600, To_Date('1-OCT-2012 04:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select 'ABC1', 'US', 'NY', 3200, To_Date('1-OCT-2012 06:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' starting from dual Union All
Select "LMN3", "UK", "BT", 2400, To_Date('1-NOV-2012 07:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' From Dual
)
Select * from tbl_nm
I need the output below.
PQR2 UK MC 2600 1 OCTOBER 2012 04:45
ABC1 US NY 3500 October 1, 2012 06:45
LMN3 UK BT 2500 November 1, 2012 07:45
The need the disc according to this system_id flagged as "A". But if the last disc of 'd' then it must show that the amount, but the file should be displayed in 'A '.
I've tried a few and got stuck. Help, please. Not able to get a balance '.
This question is a bit similar to needing help with a query result
With Tbl_Nm as
(
Select 'ABC1' System_Id, region 'US', 'CHI' Sub_Region, 4000 balance, To_Date('1-JUN-2012 10:45:00 am', 'dd-mon-yyyy hh:mi:ss am') Last_Upd_Time, 'A' flag of double Union All
Select 'PQR2', 'UK', 'LN', 2000, To_Date('1-JUL-2012 10:46:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' starting from dual Union All
Select 'ABC1', 'IND","MAMA", 3500, To_Date('1-AUG-2012 11:47:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select "LMN3", "US", "NJ", 2500, To_Date('1-SEP-2012 09:49:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select "PQR2", "UK", "MC", 2600, To_Date('1-OCT-2012 04:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), 'A' from dual Union All
Select 'ABC1', 'US', 'NY', 3200, To_Date('1-OCT-2012 06:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' starting from dual Union All
Select "LMN3", "UK", "BT", 2400, To_Date('1-NOV-2012 07:45:00 am', 'dd-mon-yyyy hh:mi:ss am'), has ' From Dual
)
Select System_Id, region, Sub_Region, Balance, Last_Upd_Time of Tbl_Nm T1
where t1. Last_Upd_Time = (select max (Last_Upd_Time) in the Tbl_Nm T2 where T1.) SYSTEM_ID = T2. SYSTEM_ID)
So maybe you'd then
ORDER BY DECODE(flag,'D',9,1) ASC...
to get the Ds at the end of the list.
or
ORDER BY CASE WHAT flag = has ' (your other filters) AND then 9 or 1 end CSA,...
HTH
-
Dialog box that says ' Creative Cloud Installer wants to make changes. Type your password for this purpose"- I type my password for Adobe ID (creative cloud), but it will not accept it. who should I go for help with this query?
It does not ask the cloud your computer admin password password!
-
Dear all
I use Oracle Database 10g and I need a hierarchical query giving following release
KING
| __JONES
| | __SCOTT
| | __ADAMS
| | __FORD
| | __SMITH
| __BLAKE
| | __ALLEN
| | __WARD
| | __MARTIN
| | __TURNER
| | __JAMES
| __CLARK
| __MILLER
Best regards
Try this
SELECT CASE WHEN level > 1 THEN LPAD (': _ ', LEVEL,' |) ')
END | Ename AS ename_tree
WCP
START WITH mgr IS NULL
CONNECT BY PRIOR empno = mgr;
-
How to write a hierarchical query so that only the child nodes are displayed?
Hi all
I have a hierarchical query that I use in an area of tree demand APEX and there are nodes that have no children and I am trying to find a way to not display these nodes. Essentially if the user does not have to develop a lot of knots to know that nothing exists at the most detailed level.
The data are based on the Oracle Fusion FND tables but for example purposes here is enough data to illustrate my question:
create table APPL_TAXONOMY_HIERARCHY (SOURCE_MODULE_ID varchar2(30), TARGET_MODULE_ID varchar2(30)); create table APPL_TAXONOMY_TL (module_id varchar2(30), description varchar2(100), user_module_name varchar2(30), language varchar2(5)); create table APPL_TAXONOMY (MODULE_ID varchar2(30), MODULE_NAME varchar2(30), MODULE_TYPE varchar2(10), MODULE_KEY varchar2(30)); create table TABLES (table_name varchar2(30), module_key varchar2(30));
insert into APPL_TAXONOMY_TL values ('1', null, 'Oracle Fusion', 'US' ); insert into APPL_TAXONOMY_TL values ('2', null, 'Financials', 'US' ); insert into APPL_TAXONOMY_TL values ('3', null, 'Human Resources', 'US' ); insert into APPL_TAXONOMY_TL values ('20', null, 'Accounts Payable', 'US' ); insert into APPL_TAXONOMY_TL values ('10', null, 'General Ledger', 'US' ); insert into APPL_TAXONOMY_HIERARCHY values ('1', 'DDDDDDDD'); insert into APPL_TAXONOMY_HIERARCHY values ('2', '1'); insert into APPL_TAXONOMY_HIERARCHY values ('3', '1'); insert into APPL_TAXONOMY_HIERARCHY values ('4', '1'); insert into APPL_TAXONOMY_HIERARCHY values ('10', '2'); insert into APPL_TAXONOMY_HIERARCHY values ('20', '2'); insert into APPL_TAXONOMY values ('1', 'Fusion', 'PROD', 'Fusion'); insert into APPL_TAXONOMY values ('2', 'Financials', 'FAMILY', 'FIN'); insert into APPL_TAXONOMY values ('10', 'GL', 'APP', 'GL'); insert into APPL_TAXONOMY values ('3', 'Human Resources', 'FAMILY', 'HR'); insert into APPL_TAXONOMY values ('20', 'AP', 'APP', 'AP'); insert into tables values ('GL_JE_SOURCES_TL','GL'); insert into tables values ('GL_JE_CATEGORIES','GL');
My hierarchical query is as follows:
with MODULES as ( SELECT h.source_module_id, b.user_module_name, h.target_module_id FROM APPL_TAXONOMY_HIERARCHY H, APPL_TAXONOMY_TL B, APPL_TAXONOMY VL where H.source_module_id = b.module_id and b.module_id = vl.module_id and vl.module_type not in ('PAGE', 'LBA') UNION ALL select distinct table_name, table_name, regexp_substr(table_name,'[^_]+',1,1) from TABLES --needed as a link between TABLES and APPL_TAXONOMY union all select module_key as source_module_id, module_name as user_module_name, module_id as target_module_id from appl_taxonomy VL where VL.module_type = 'APP') SELECT case when connect_by_isleaf = 1 then 0 when level = 1 then 1 else -1 end as status, LEVEL, user_module_name as title, null as icon, ltrim(user_module_name, ' ') as value, null as tooltip, null as link FROM MODULES START WITH source_module_id = '1' CONNECT BY PRIOR source_module_id = target_module_id ORDER SIBLINGS BY user_module_name;
In Oracle APEX, this gives a tree with the appropriate data, you can see here:
https://Apex.Oracle.com/pls/Apex/f?p=32581:29 (username: guest, pw: app_1000);
The SQL of the query results are:
STATUS TITLE LEVEL VALUE ---------- ---------- ------------------------------ ------------------------------
1 1 oracle Fusion Oracle Fusion -1 2 financial tables Financials -1 3 accounts payable Accounts payable 0 4 AP AP -1 General Accounting 3 General Accounting -1 4 GL GL 0 5 GL_JE_CATEGORIES GL_JE_CATEGORIES 0 5 GL_JE_SOURCES_TL GL_JE_SOURCES_TL 0 2 human resources Human resources The lowest level is the name of the table to level 5. HR is not any level under level 2, in the same way, "AP" (level 4) has nothing below, i.e. no level 5 and that's why I don't want to show these nodes. Is this possible with the above query?
Thanks in advance for your suggestions!
John
Hello
The following query will include only the nodes of level = 5 and their ancestors (or descendants):
WITH modules LIKE
(
SELECT h.source_module_id
b.user_module_name AS the title
h.target_module_id
To appl_taxonomy_hierarchy:
appl_taxonomy_tl b
appl_taxonomy vl
WHERE h.source_module_id = b.module_id
AND b.module_id = vl.module_id
AND vl.module_type NOT IN ('PAGE', "LBA")
UNION ALL
SELECT DISTINCT
table-name
table_name
, REGEXP_SUBSTR (table_name, ' [^ _] +')
From the tables - required as a link between the TABLES and APPL_TAXONOMY
UNION ALL
SELECT module_key AS source_module_id
AS user_module_name module_name
module_id AS target_module_id
Of appl_taxonomy vl
WHERE vl.module_type = 'APP '.
)
connect_by_results AS
(
SELECT THE CHECK BOX
WHEN CONNECT_BY_ISLEAF = 1 THEN 0
WHEN LEVEL = 1 THEN 1
OF ANOTHER-1
The END as status
LEVEL AS lvl
title
-, NULL AS icon
, LTRIM (title, "") AS the value
-, NULL as ToolTip
-, Link AS NULL
source_module_id
SYS_CONNECT_BY_PATH (source_module_id - or something unique
, ' ~' - or anything else that may occur in the unique key
) || ' ~' AS the path
ROWNUM AS sort_key
Modules
START WITH source_module_id = '1'
CONNECT BY PRIOR Source_module_id = target_module_id
Brothers and SŒURS of ORDER BY title
)
SELECT the status, lvl, title, value
-, icon, tooltip, link
OF connect_by_results m
WHEN THERE IS)
SELECT 1
OF connect_by_results
WHERE the lvl = 5
AND the path AS ' % ~' | m.source_module_id
|| '~%'
)
ORDER BY sort_key
;
You may notice that subqueries modules and the connect_by_results are essentially what you've posted originally. What was the main request is now called connect_by_results, and it has a couple of additional columns that are necessary in the new main request or the EXISTS subquery.
However, I am suspicious of the 'magic number' 5. Could you have a situation where the sheets you are interested in can be a different levels (for example, some level = 5 and then some, into another branch of the tree, at the LEVEL = 6, or 7 or 4)? If so, post an example. You have need of a Query of Yo-Yo, where you do a bottom-up CONNECT BY query to get the universe of interest, and then make a descendant CONNECT BY query on this set of results.
Maybe you are looking for
-
Is it possible to manually reassign a BSD name on a disc?
Hi all I'm running a dual-boot configuration (via Bootcamp) and after initially all set up, had to temporarily set up another partition on the hard drive with my OS X and Windows/Bootcamp partition. Do seem so have reassigned my Bootcamp partition to
-
Satellite A60 summary failure and press a key to continue
I have a problem with my satellite A60.I had the computer for about a year and a half and have never had any serious problems with it of any kind. However, last week the keyboard started to fail, first with only a few keys, then the full keyboard. It
-
DV7-lights remain on after stopping
I have a problem with laptop DV7 - 3164CL s. Everything works perfectly EXCEPT when I stopped, the machine stops (power led on front left goes and top off) but the mute led, the volume, the multimedia control slider of the duct and the stay of the a
-
Satellite A30: want to partion the HDD - how to do this?
After installing a new HARD drive in my Satellite A30, I installed windows using the recovery disks, but now you want to partion the drive, how do I do this?Thank you very much
-
Blue screen T430s-2352 and Code 101 problem
Hi all By the use of a month of my T430s, I have met four times with BSOD(Blue Screen) and the two recent showed the same error message: Clock interruption A has not received on a secondary processor within the allotted time interval. And tstop code: