Hierarchical query question
Hi all
I'm working on the database version (please avoid comments like "you should upgrade to a newer version," it's not me):
Select * from version of v$.
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64 bit Production
PL/SQL Release 9.2.0.8.0 - Production
CORE Production 9.2.0.8.0
AMT for HP - UX: 9.2.0.8.0 - Production Version
NLSRTL Version 9.2.0.8.0 - Production
I have the following hierarchical data:
with mydata (emp_id, mgr_id, RESP) as
(
Select 1, null, 'Y' from dual union all
Select 2, 1, "n" of all the double union
Select option 3, 2, "n" of all the double union
Select 4, 1, 'Y' from dual union all
Select 5, 4, the double "n" of all union
Select 6, 5, 'Y' from dual union all
Select 7, 6, the double "n" of all union
Select 8, 1, the double "n" of all union
Select 9, 8, the double "n" of all union
Select 10, 9, "Y" of the double
)
Select emp_id, mgr_id, RESP
of mydata
connect mgr_id = emp_id prior
Start by emp_id = 1;
EMP_ID MGR_ID RESP
---------- ---------- ----
1 Y
2 1 N
3 2 N
4 1
5 4 N
6 5
7 6 N
8 1 N
9 8 N
10 9 Y
10 selected lines.
Each employee has a Manager (self or the following in the upper hierarchy with RESP = 'Y')
The root must be always charged.
To find who is responsible for a certain employee ID, I can run the following query:
I... responsible e: emp_id = 7 is 6
Select emp_id, mgr_id, RESP
of mydata
When resp = 'Y '.
and rownum < = 1
Connect prior mgr_id = emp_id
Start by emp_id = 7;
EMP_ID
----------
6
1 selected line.
i.e.: head = emp_id is 1/9
Select emp_id
of mydata
When resp = 'Y '.
and rownum < = 1
Connect prior mgr_id = emp_id
Start by emp_id = 9;
EMP_ID
----------
1
1 selected line.
i.e.: Manager emp_id = 4 is auto
Select emp_id
of mydata
When resp = 'Y '.
and rownum < = 1
Connect prior mgr_id = emp_id
Start by emp_id = 4;
EMP_ID
----------
4
1 selected line.
What query is the fastest to get all employees to a certain level of responsibility?
That is to say: all employees not responsible according to 1 should give:
EMP_ID MGR_ID RESP
---------- ---------- ----
2 1 N
3 2 N
8 1 N
9 8 N
Kind regards.
Alberto
Hi, Alberto.
So, you want to quit looking more far down the tree when you come to a node with an RESP = 'Y', right?
Just include an RESP = ' don't (or resp. <> 'Y' or NVL (RESP, 'Y' <> 'Y') in the CONNECT BY State, like this:)
Select emp_id, mgr_id, RESP
of mydata
connect mgr_id = emp_id prior
and RESP = "n"-* NEW *.
Start by emp_id = 1;
Tags: Database
Similar Questions
-
Hierarchical query question (2)
-Oracle Database 11 g Enterprise Edition Release 11.1.0.6.0 - 64 bit Production
I'm putting together the two hierarchies. The first is the Center and the center of each parent to the top. The second attribute for each lower level is centre and it all the way to the top. Two hierarchies are in the same TABLE. An attribute if there is a Center in the ParentAttribId COLUMN (Conversely, the id COLUMN in this TABLE may be Centers.) Ultimately, the data will be listed record by record, with all parents in the form of columns.
The query hierarchy Center works. The parent column records effort will be later, I worry about it right now. What I am struggling with is how to reach to get id from the Center in the attribute hierarchy. The fragment of the query (in the second ETC) trying to recover Center.Id, who is not in the scope, because it is included in the START WITH clause. But how to include in the FROM clause (to bring it within the scope), when it has nothing to do with the hierarchy (other than the starting point).
< PRE >
WITH
Center_List_Hierarchy
AS
(
SELECT
-List 4) of the hierarchy of each Center, the level and the id.
--
-Note: by definition, CONNECT_BY_ROOT ModelId == ModelId ==: model.
-ModelId returned to not use: model (in the outer query).
CONNECT_BY_ROOT Id Center_Root,
Center_Level LEVEL,
ModelId model,
ID
Of
ADMINEPO. PP_Respcenter
CONNECT
(--3) for each Center, go to (and understand) top, identified by Id = ParentId.
ModelId = ModelId PRIOR
AND Id = ParentId PRIOR
AND PREREQUISITE Id & lt; & gt; ParentId PRIOR
START BY
(ModelId, Id) IN
(
SELECT
Attribute.ModelId,
Attribute.Id
Of
ADMINEPO. PP_Respcenter_Name Center_Name,
ADMINEPO. Attribute PP_AT_RespCenter
WHERE
(1) for this model, find the id of the list attribute.
Center_Name.ModelId =: model
AND Center_Name.LangId =: Name_Type_Default
AND UPPER (Center_Name.NAME) = "LIST of CENTER.
(--2) get all the centres associated with the attribute.
AND Attribute.ModelId = Center_Name.ModelId
AND Attribute.ParentAttribId = Center_Name.Id
)
),
Attribute_Hierarchy
AS
(
SELECT
(--4) for this Center, get each attribute with its hierarchy.
Center.Id Center,
CONNECT_BY_ROOT Id Attribute_Root,
Attribute_Level LEVEL,
ModelId model,
ID
Of
ADMINEPO. PP_Respcenter
CONNECT
(--3) for each attribute, go to (and understand) top, identified by Id = ParentId.
ModelId = ModelId PRIOR
AND Id = ParentId PRIOR
AND PREREQUISITE Id & lt; & gt; ParentId PRIOR
START BY
(ModelId, Id) IN
(
SELECT
Attribute.ModelId,
Attribute.ParentAttribId
Of
Center_List_Hierarchy Center
ADMINEPO. Attribute PP_AT_RespCenter
WHERE
(1) limit to the low level of the centres.
Center.Center_Level = 1
(--2) get his attributes.
AND Attribute.ModelId = Center.Model
AND Attribute.Id = Center.Id
)
)
< / PRE >Hello
Sorry, I don't understand.
Whenever you have a problem, post a small example of data (CREATE TABLE and only relevant columns, INSERT statements) for all the tables and also post the results desired from these data.
Explain, using specific examples, how you get these results from these data.
If you can show your problem using tables commonly available, such as scott.emp or hr.employees (which contains hierarcies) so you don't have to display the sample data; just results and explanations.Brian Tkatch wrote:
... What I am struggling with is how to reach to get id from the Center in the attribute hierarchy. The fragment of the query (in the second ETC) trying to recover Center.Id, who is not in the scope, because it is included in the START WITH clause.Isn't this Attribute_Root below?
... Attribute_Hierarchy
AS
(
SELECT
(--4) for this Center, get each attribute with its hierarchy.
Center.Id Center,
CONNECT_BY_ROOT Id Attribute_Root,
Attribute_Level LEVEL,
ModelId model,
ID
Of...
-
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.
-
Hello
Question:
In a hierarchical query, is it possible for a line having more than one immediate ancestor?Answer:
Isn't it? Surely this is Yes?
Thank you
Jason
Line may have ancestors as much as you want. It goes the same for successors.
SY.
-
Getting the line without the use of hierarchical query values
Hi all
I want to know the hierarchical values without using a hierarchical query. I have two tables EMP, DEPT
EMP table is to have two columns (empid, mgrid)
DEPT table is to have two columns (deptid, empid)
Data of the EMP
1,
2, 1
3, 2
4, 3
Data DEPT
10, 1
Each time, I gave deptid = 10, I need to know the this deptid empid then who is this empid (child levels as well). In this case, the output should be
1
2
3
4
I don't want to use hierarchical query.
Thanks in advance.
Thank you
PALYou can use the RECURSIVE subquery, if you are 11 GR 2, like this
SQL> with EMP (empid,mgrid) as 2 ( 3 select 1,null from dual union all 4 select 2, 1 from dual union all 5 select 3, 2 from dual union all 6 select 4, 3 from dual 7 ), 8 dept(deptid,empid) as 9 ( 10 select 10, 1 from dual 11 ), 12 t(empid,mgrid) as 13 ( 14 select empid,mgrid 15 from emp e 16 where empid in ( 17 select d.empid 18 from dept d 19 where deptid = 10 20 ) 21 union all 22 select e.empid,e.mgrid 23 from emp e, t 24 where e.mgrid = t.empid 25 ) 26 select * 27 from t; EMPID MGRID ---------- ---------- 1 2 1 3 2 4 3
Yet, the question is valid - why can't use you a hierarchical query?
Published by: JAC on May 29, 2013 12:37
-
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 query, differentiate between the leafs and nodes?
Hello
I started coding a small program PL/SQL (not finished) with a hierarchical query:
This program must return a hierarchical HTML code like this (he does not at the moment):DECLARE CURSOR cur IS select op_id||' '||op_descript as description, level from operations connect by prior op_id = op_parent_op_id start with op_id = 0; BEGIN HTP.prn('<ul id="arbre2" class="filetree">'); for c in cur loop HTP.prn('<li><span class="folder">'||c.description||'</span></li>'); end loop; HTP.prn('</ul>'); END;
then jQuery will make a tree.<ul id="arbre" class="filetree"> <li><span class="folder">Folder 1</span> <ul> <li><span class="file">Item 1.1</span></li> </ul> </li> <li><span class="folder">Folder 2</span> <ul> <li><span class="folder">Subfolder 2.1</span> <ul> <li><span class="file">File 2.1.1</span></li> <li><span class="file">File 2.1.2</span></li> </ul> </li> <li><span class="file">File 2.2</span></li> </ul> </li> <li class="closed"><span class="folder">Folder 3 (closed at start)</span> <ul> <li><span class="file">File 3.1</span></li> </ul> </li> <li><span class="file">File 4</span></li> </ul>
But I don't know how to differentiate leafs and nodes in the request, to allow me to specify a class = 'file' or class = 'file '.
Does anyone have a solution?
A more general question might be: how to generate a hierarchical HTML code exactly as it is above my table operations (op_id, op_parent_op_id, descript).
Thank you.
Yann.Discover the CONNECT_BY_ISLEAF pseudo-column. Returns 1 if it is a leaf and zero otherwise.
HTH!
-
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?
-
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);
-
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.
-
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;
-
Support for hierarchical query
Hi all
I must be tired and can't think clearly, so I am a little confused the following query.
The environment is Oracle 9i:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64 bit Production
PL/SQL Release 9.2.0.8.0 - Production
CORE Production 9.2.0.8.0
AMT for HP - UX: 9.2.0.8.0 - Production Version
NLSRTL Version 9.2.0.8.0 - Production
Suppose I have the following data:
with mydata as
(
Select the code 1, code_high, null, 'John' cname 'Smith' csurname, 'X' union resp. double all the
Select 2 code, 1 code_high, cname 'Bill', 'White' csurname, RESP null in union double all the
Select 3 code, code_high 2, 'Fred' cname 'Reed' csurname, 'X' union resp. double all the
Select 4 code, code_high, null, 'Tim' cname 'Hackman' csurname, 'X' union resp. double all the
Select code 5, code_high 4, 'John', 'Reed' cname csurname resp null in union double all the
Select 6 code, code_high 5, cname 'Bill', 'Hakcman' csurname, 'X' union resp. double all the
Select the code 7, code_high 6, cname 'Fred' csurname 'White', null union resp. double all the
Select code 8, code_high 7, 'Bill' cname 'Smith' csurname, resp. union null double all the
Select 9 code, code_high 8, cname "Tom", "Reed" csurname, null double RESP
)
Select *.
of mydata;
CODE CODE_HIGH CNAME CSURNAME RESP
---------- ---------- ----- -------- ----
John Smith 1 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
It is a hierarchical query where code_high represents the father.
I need to find in the hierarchy of higher level responsible for each code.
Suppose I want to find in the hierarchy, one with resp = 'X '.
Run the following query I find for the code = 9
Select phone, cname, csurname code
of mydata
When resp = 'X '.
and rownum = 1
Connect prior code_high = code
start with code = 9;
CODE CNAME CSURNAME
---------- ----- --------
Bill 6 Hakcman
Is there a way to get the full list with the loaded correspondents.
The expected results are:
CODE CODE_HIGH CNAME CSURNAME RESP. RESP_CODE RESP_NAME RESP_SURNAME
---------- ---------- ----- -------- ---- --------- --------- ------------
1 John Smith John Smith 1 X
2 1 bill White 1 John Smith
3 2 Fred Reed X 3 Fred Reed
Tim Hackman 4 X 4 Tim Hackman
5 4 John Smith 4 Tim Hackman
6 5 bill Hakcman Bill Hakcman 6 X
7 6 Fred White 6 Bill Hakcman
8 7 bill Smith 6 Bill Hakcman
9 8 Tom Reed 6 Bill Hakcman
Kind regards.
Alberto
Hi, Alberto.
I know that you are using Oracle 9; That's why I mentioned that you would have to use a substitute for CONNECT_BY_ROOT. Before I could show how, I saw the solution of the Padders, which is probably simpler and more efficient for this work. Padders used REGEXP_SUBSTR, which is not available in Oracle 9, but you can use SUBSTR and INSTR instead.
Here is the solution of the Padders for Orcle 9:
WITH got_resp_path AS
(
SELECT m.*
RTRIM (SYS_CONNECT_BY_PATH (CASE
WHEN resp = 'X '.
THEN the code
END
, ' '
)
) AS resp_path
OF mydata m
START WITH code_high IS NULL
CONNECT BY code_high = code PRIOR
)
C. SELECT
r.code AS resp_code
r.cname AS resp_name
r.csurname AS resp_surname
OF got_resp_path c
JOIN mydata r ON r.code = TO_NUMBER (SUBSTR (c.resp_path
INSTR (c.resp_path
, ' '
-1
)
)
)
ORDER BY c.code
;
I agree that what you posted in your last post is not very satisfactory. Rather than make a CONNECT a separate query for each column of resp_ you want to view, you can modify it to get only the unique code and then use it in a join, as Padders, to get all the other columns you need.
-
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 -
Problems with views based on a hierarchical query
Datamodeler 3.1.3.706 (SQL Dev 3.2.10.09):
When you create a view that uses a hierarchical query, the query designer encounter various difficulties:
When pasting in the SQL code, if the notice is registered without first clicking the schema update button, the object in the entity-relationship diagram view provides a faithful representation of the view without errors, but when the reopening of the view, the code is missing.
Simple example with the classic emp table:
If you press the schema update button to refresh the display. He mangles connect it by the clause and the view gets marked with a warning/error icon in the diagram of the relationships, but the now decomposed code remains available on reopening of the query designer.SELECT level lev , emp.* FROM emp CONNECT BY prior empno = mgr START WITH mgr IS NULL
Same code as above after having clicked on the button of update of schema:
Other issues are met if the query contains a column CONNECT_BY_ % nickname hierarchical:SELECT Level lev , emp.* FROM emp CONNECT BY
In this case, paste in the code and clicking Update schema button or the OK button translates into a "unexpected Token' error analysis.SELECT level , emp.* , connect_by_root emp.ename root_ename FROM emp CONNECT BY prior empno = mgr START WITH mgr IS NULL;
These problems are encountered with the logic model and the relational.
Is this a known issue? I searched this forum but have not found any references to this.
Thank you
SentinelHi, Sentinel,
I logged a bug for this.
You can try 3.3 DM treat it better first problem, analysis of connect_by_root operator will pass if you do not alias.Philippe
Maybe you are looking for
-
Really slow copying files to iMac to Seagate external HARD drive
I have an iMac mid-2011 running El Capitan, and I'm having a problem copying through large files to my TB 5 Seagate external hard drives. The copy process is so slow that it is useless to try to back up files more. Does anyone know what I can do to
-
Unable to adtivate «empy recycle bin»
simple (I think) when I click on "Basket", the option to empty is not highlighted (therefore can not empty)
-
Why is it so expensive dial Skype?
-
A115-s3094 satellite: need video controller XP driver
Hello Can anyone help? I was on my laptop and my son accidentally deleted a video driver or video controller, and I can't do it because I don't have a CD with the drivers on it, or a backup copy. The thing is I could use the laptop, but once I stoppe
-
Can't play the game, because the downloaded patches are incompatible.
Original title: fair game will not play Hi I ask LMA manager 2007 for pc at least windows xp everytime that I open it it downloads the patches that do not work because they are incompatible if anyone can help pppllleeeaaassseee