Hierarchical Query Child OverrideInserting multiple rows in a single SQL query?How do I limit the number of rows returned by an Oracle query after ordering?one-to-many query selecting all parents and single top child for each parentReplace Default Null Values Returned From Left Outer JoinJoin vs. sub-queryHow to query MongoDB with “like”?What are the options for storing hierarchical data in a relational database?Joins: How to Return default values for empty right side of left outer joinreturn null if no rows found oracle query with IN clauseHQL Left outer join with temp tables
Suffocation while cooking under an umbrella?
A file manager to open a zip file like opening a folder, instead of extract it by using a archive manager
What is the difference between an astronaut in the ISS and a freediver in perfect neutral buoyancy?
Fuel sender works when outside of tank, but not when in tank
Carry vs Roll-Down on a zero-coupon IRS
Is there something that can completely prevent the effects of the Hold Person spell?
Is it acceptable to say that a reviewer's concern is not going to be addressed because then the paper would be too long?
Does the Way of Shadow monk's Shadow Step feature count as a magical ability?
How to see the previous "Accessed" date in Windows
What is the white pattern on trim wheel for?
Pi Zero Work With Embedded WIFI And Cellular USB Modem
What are ATC-side procedures to handle a jammed frequency?
Strange Sticky Substance on Digital Camera
List of 1000 most common words across all languages
Can an integer optimization problem be convex?
practicality of 30 year fix mortgage at 55 years of age
How to deal with a Homophobic PC
Is it a good idea to leave minor world details to the reader's imagination?
A famous scholar sent me an unpublished draft of hers. Then she died. I think her work should be published. What should I do?
Why are there two fundamental laws of logic?
What exactly did this mechanic sabotage on the American Airlines 737, and how dangerous was it?
How do you use the interjection for snorting?
Why does this image of Jupiter look so strange?
Excel Solver linear programming - Is it possible to use average of values as a constraint without #DIV/0! errors or sacrificing linearity?
Hierarchical Query Child Override
Inserting multiple rows in a single SQL query?How do I limit the number of rows returned by an Oracle query after ordering?one-to-many query selecting all parents and single top child for each parentReplace Default Null Values Returned From Left Outer JoinJoin vs. sub-queryHow to query MongoDB with “like”?What are the options for storing hierarchical data in a relational database?Joins: How to Return default values for empty right side of left outer joinreturn null if no rows found oracle query with IN clauseHQL Left outer join with temp tables
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have a hierarchical company structure where each company has an optional company sector. Child companies inherit their parent's sector if they don't have their own, but the child company sector overrides its parent's if the child one.
I need to produce a sum of the bill amount grouped by sector. Companies with no sector are ignored.
The ParentCompanyID column in the Company table is a foreign key to itself. There can be an unlimited number of parent/child levels.
Company Table
CompanyID ParentCompanyID
1 null
2 1
3 2
4 null
5 4
6 null
7 6
8 7
CompanySector Table
CompanyID Sector
1 Distribution
4 Distribution
5 Manufacturing
8 Manufacturing
Timesheet Table
CompanyID BillAmount
1 100
1 200
2 100
3 50
4 25
5 75
6 75
7 115
8 115
The result I expect to see here is:
Sector BillAmount
Distribution 475
Manufacturing 190
Below is how I am currently doing it. It is extremely inefficient and doesn't work for unlimited number of hierarchical levels.
WITH Company AS
( SELECT 1 CompanyID, NULL ParentCompanyID FROM dual
UNION
SELECT 2, 1 FROM dual
UNION
SELECT 3, 2 FROM dual
UNION
SELECT 4, NULL FROM dual
UNION
SELECT 5, 4 FROM dual
UNION
SELECT 6, NULL FROM dual
UNION
SELECT 7, 6 FROM dual
UNION
SELECT 8, 7 FROM dual
),
CompanySector AS
( SELECT 1 CompanyID, 'Distribution' Sector FROM dual
UNION
SELECT 4 , 'Distribution' FROM dual
UNION
SELECT 5 , 'Manufacturing' FROM dual
UNION
SELECT 8 , 'Manufacturing' FROM dual
),
Timesheets AS
( SELECT 1 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 1 CompanyID, 200 BillAmount FROM dual
UNION
SELECT 2 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 3 CompanyID, 50 BillAmount FROM dual
UNION
SELECT 4 CompanyID, 25 BillAmount FROM dual
UNION
SELECT 5 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 6 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 7 CompanyID, 115 BillAmount FROM dual
UNION
SELECT 8 CompanyID, 115 BillAmount FROM dual
),
--Dummy tables above
--My current way of doing it below
companies AS
(SELECT c.*,
cs.sector
FROM company c
LEFT OUTER JOIN CompanySector cs
ON c.companyID = cs.companyID
),
sectors AS
(SELECT levelOne.companyID,
NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) sector
FROM companies levelOne
LEFT OUTER JOIN companies levelTwo
ON levelOne.parentcompanyid = levelTwo.companyID
LEFT OUTER JOIN companies levelThree
ON levelTwo.parentcompanyid = levelThree.companyID
WHERE NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) IS NOT NULL
)
SELECT s.sector,
SUM(t.billamount)
FROM sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
What is a cleaner and more efficient way of doing this?
sql oracle hierarchical-data
add a comment
|
I have a hierarchical company structure where each company has an optional company sector. Child companies inherit their parent's sector if they don't have their own, but the child company sector overrides its parent's if the child one.
I need to produce a sum of the bill amount grouped by sector. Companies with no sector are ignored.
The ParentCompanyID column in the Company table is a foreign key to itself. There can be an unlimited number of parent/child levels.
Company Table
CompanyID ParentCompanyID
1 null
2 1
3 2
4 null
5 4
6 null
7 6
8 7
CompanySector Table
CompanyID Sector
1 Distribution
4 Distribution
5 Manufacturing
8 Manufacturing
Timesheet Table
CompanyID BillAmount
1 100
1 200
2 100
3 50
4 25
5 75
6 75
7 115
8 115
The result I expect to see here is:
Sector BillAmount
Distribution 475
Manufacturing 190
Below is how I am currently doing it. It is extremely inefficient and doesn't work for unlimited number of hierarchical levels.
WITH Company AS
( SELECT 1 CompanyID, NULL ParentCompanyID FROM dual
UNION
SELECT 2, 1 FROM dual
UNION
SELECT 3, 2 FROM dual
UNION
SELECT 4, NULL FROM dual
UNION
SELECT 5, 4 FROM dual
UNION
SELECT 6, NULL FROM dual
UNION
SELECT 7, 6 FROM dual
UNION
SELECT 8, 7 FROM dual
),
CompanySector AS
( SELECT 1 CompanyID, 'Distribution' Sector FROM dual
UNION
SELECT 4 , 'Distribution' FROM dual
UNION
SELECT 5 , 'Manufacturing' FROM dual
UNION
SELECT 8 , 'Manufacturing' FROM dual
),
Timesheets AS
( SELECT 1 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 1 CompanyID, 200 BillAmount FROM dual
UNION
SELECT 2 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 3 CompanyID, 50 BillAmount FROM dual
UNION
SELECT 4 CompanyID, 25 BillAmount FROM dual
UNION
SELECT 5 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 6 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 7 CompanyID, 115 BillAmount FROM dual
UNION
SELECT 8 CompanyID, 115 BillAmount FROM dual
),
--Dummy tables above
--My current way of doing it below
companies AS
(SELECT c.*,
cs.sector
FROM company c
LEFT OUTER JOIN CompanySector cs
ON c.companyID = cs.companyID
),
sectors AS
(SELECT levelOne.companyID,
NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) sector
FROM companies levelOne
LEFT OUTER JOIN companies levelTwo
ON levelOne.parentcompanyid = levelTwo.companyID
LEFT OUTER JOIN companies levelThree
ON levelTwo.parentcompanyid = levelThree.companyID
WHERE NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) IS NOT NULL
)
SELECT s.sector,
SUM(t.billamount)
FROM sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
What is a cleaner and more efficient way of doing this?
sql oracle hierarchical-data
add a comment
|
I have a hierarchical company structure where each company has an optional company sector. Child companies inherit their parent's sector if they don't have their own, but the child company sector overrides its parent's if the child one.
I need to produce a sum of the bill amount grouped by sector. Companies with no sector are ignored.
The ParentCompanyID column in the Company table is a foreign key to itself. There can be an unlimited number of parent/child levels.
Company Table
CompanyID ParentCompanyID
1 null
2 1
3 2
4 null
5 4
6 null
7 6
8 7
CompanySector Table
CompanyID Sector
1 Distribution
4 Distribution
5 Manufacturing
8 Manufacturing
Timesheet Table
CompanyID BillAmount
1 100
1 200
2 100
3 50
4 25
5 75
6 75
7 115
8 115
The result I expect to see here is:
Sector BillAmount
Distribution 475
Manufacturing 190
Below is how I am currently doing it. It is extremely inefficient and doesn't work for unlimited number of hierarchical levels.
WITH Company AS
( SELECT 1 CompanyID, NULL ParentCompanyID FROM dual
UNION
SELECT 2, 1 FROM dual
UNION
SELECT 3, 2 FROM dual
UNION
SELECT 4, NULL FROM dual
UNION
SELECT 5, 4 FROM dual
UNION
SELECT 6, NULL FROM dual
UNION
SELECT 7, 6 FROM dual
UNION
SELECT 8, 7 FROM dual
),
CompanySector AS
( SELECT 1 CompanyID, 'Distribution' Sector FROM dual
UNION
SELECT 4 , 'Distribution' FROM dual
UNION
SELECT 5 , 'Manufacturing' FROM dual
UNION
SELECT 8 , 'Manufacturing' FROM dual
),
Timesheets AS
( SELECT 1 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 1 CompanyID, 200 BillAmount FROM dual
UNION
SELECT 2 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 3 CompanyID, 50 BillAmount FROM dual
UNION
SELECT 4 CompanyID, 25 BillAmount FROM dual
UNION
SELECT 5 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 6 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 7 CompanyID, 115 BillAmount FROM dual
UNION
SELECT 8 CompanyID, 115 BillAmount FROM dual
),
--Dummy tables above
--My current way of doing it below
companies AS
(SELECT c.*,
cs.sector
FROM company c
LEFT OUTER JOIN CompanySector cs
ON c.companyID = cs.companyID
),
sectors AS
(SELECT levelOne.companyID,
NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) sector
FROM companies levelOne
LEFT OUTER JOIN companies levelTwo
ON levelOne.parentcompanyid = levelTwo.companyID
LEFT OUTER JOIN companies levelThree
ON levelTwo.parentcompanyid = levelThree.companyID
WHERE NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) IS NOT NULL
)
SELECT s.sector,
SUM(t.billamount)
FROM sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
What is a cleaner and more efficient way of doing this?
sql oracle hierarchical-data
I have a hierarchical company structure where each company has an optional company sector. Child companies inherit their parent's sector if they don't have their own, but the child company sector overrides its parent's if the child one.
I need to produce a sum of the bill amount grouped by sector. Companies with no sector are ignored.
The ParentCompanyID column in the Company table is a foreign key to itself. There can be an unlimited number of parent/child levels.
Company Table
CompanyID ParentCompanyID
1 null
2 1
3 2
4 null
5 4
6 null
7 6
8 7
CompanySector Table
CompanyID Sector
1 Distribution
4 Distribution
5 Manufacturing
8 Manufacturing
Timesheet Table
CompanyID BillAmount
1 100
1 200
2 100
3 50
4 25
5 75
6 75
7 115
8 115
The result I expect to see here is:
Sector BillAmount
Distribution 475
Manufacturing 190
Below is how I am currently doing it. It is extremely inefficient and doesn't work for unlimited number of hierarchical levels.
WITH Company AS
( SELECT 1 CompanyID, NULL ParentCompanyID FROM dual
UNION
SELECT 2, 1 FROM dual
UNION
SELECT 3, 2 FROM dual
UNION
SELECT 4, NULL FROM dual
UNION
SELECT 5, 4 FROM dual
UNION
SELECT 6, NULL FROM dual
UNION
SELECT 7, 6 FROM dual
UNION
SELECT 8, 7 FROM dual
),
CompanySector AS
( SELECT 1 CompanyID, 'Distribution' Sector FROM dual
UNION
SELECT 4 , 'Distribution' FROM dual
UNION
SELECT 5 , 'Manufacturing' FROM dual
UNION
SELECT 8 , 'Manufacturing' FROM dual
),
Timesheets AS
( SELECT 1 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 1 CompanyID, 200 BillAmount FROM dual
UNION
SELECT 2 CompanyID, 100 BillAmount FROM dual
UNION
SELECT 3 CompanyID, 50 BillAmount FROM dual
UNION
SELECT 4 CompanyID, 25 BillAmount FROM dual
UNION
SELECT 5 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 6 CompanyID, 75 BillAmount FROM dual
UNION
SELECT 7 CompanyID, 115 BillAmount FROM dual
UNION
SELECT 8 CompanyID, 115 BillAmount FROM dual
),
--Dummy tables above
--My current way of doing it below
companies AS
(SELECT c.*,
cs.sector
FROM company c
LEFT OUTER JOIN CompanySector cs
ON c.companyID = cs.companyID
),
sectors AS
(SELECT levelOne.companyID,
NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) sector
FROM companies levelOne
LEFT OUTER JOIN companies levelTwo
ON levelOne.parentcompanyid = levelTwo.companyID
LEFT OUTER JOIN companies levelThree
ON levelTwo.parentcompanyid = levelThree.companyID
WHERE NVL(levelOne.sector, NVL(levelTwo.sector, NVL(levelThree.sector, NULL))) IS NOT NULL
)
SELECT s.sector,
SUM(t.billamount)
FROM sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
What is a cleaner and more efficient way of doing this?
sql oracle hierarchical-data
sql oracle hierarchical-data
asked Mar 28 at 17:35
Alex03Alex03
561 silver badge7 bronze badges
561 silver badge7 bronze badges
add a comment
|
add a comment
|
1 Answer
1
active
oldest
votes
I believe this will do it. Using the hierarchical query syntax, populate sector from the parent record where needed.
WITH
base_sectors AS (
SELECT * FROM company LEFT OUTER JOIN companySector USING (companyID)
)
, final_sectors AS (
SELECT companyID, NVL( sector, PRIOR sector ) AS sector
FROM base_sectors
START WITH parentCompanyID IS NULL
CONNECT BY parentCompanyID = PRIOR companyID
)
SELECT s.sector,
SUM(t.billamount)
FROM final_sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing theNVL
expression withSYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.
– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
add a comment
|
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55403757%2fhierarchical-query-child-override%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I believe this will do it. Using the hierarchical query syntax, populate sector from the parent record where needed.
WITH
base_sectors AS (
SELECT * FROM company LEFT OUTER JOIN companySector USING (companyID)
)
, final_sectors AS (
SELECT companyID, NVL( sector, PRIOR sector ) AS sector
FROM base_sectors
START WITH parentCompanyID IS NULL
CONNECT BY parentCompanyID = PRIOR companyID
)
SELECT s.sector,
SUM(t.billamount)
FROM final_sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing theNVL
expression withSYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.
– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
add a comment
|
I believe this will do it. Using the hierarchical query syntax, populate sector from the parent record where needed.
WITH
base_sectors AS (
SELECT * FROM company LEFT OUTER JOIN companySector USING (companyID)
)
, final_sectors AS (
SELECT companyID, NVL( sector, PRIOR sector ) AS sector
FROM base_sectors
START WITH parentCompanyID IS NULL
CONNECT BY parentCompanyID = PRIOR companyID
)
SELECT s.sector,
SUM(t.billamount)
FROM final_sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing theNVL
expression withSYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.
– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
add a comment
|
I believe this will do it. Using the hierarchical query syntax, populate sector from the parent record where needed.
WITH
base_sectors AS (
SELECT * FROM company LEFT OUTER JOIN companySector USING (companyID)
)
, final_sectors AS (
SELECT companyID, NVL( sector, PRIOR sector ) AS sector
FROM base_sectors
START WITH parentCompanyID IS NULL
CONNECT BY parentCompanyID = PRIOR companyID
)
SELECT s.sector,
SUM(t.billamount)
FROM final_sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
I believe this will do it. Using the hierarchical query syntax, populate sector from the parent record where needed.
WITH
base_sectors AS (
SELECT * FROM company LEFT OUTER JOIN companySector USING (companyID)
)
, final_sectors AS (
SELECT companyID, NVL( sector, PRIOR sector ) AS sector
FROM base_sectors
START WITH parentCompanyID IS NULL
CONNECT BY parentCompanyID = PRIOR companyID
)
SELECT s.sector,
SUM(t.billamount)
FROM final_sectors s
INNER JOIN timesheets t
ON s.companyID = t.companyID
GROUP BY sector;
edited Mar 28 at 18:36
answered Mar 28 at 17:52
Dave CostaDave Costa
40.2k6 gold badges50 silver badges67 bronze badges
40.2k6 gold badges50 silver badges67 bronze badges
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing theNVL
expression withSYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.
– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
add a comment
|
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing theNVL
expression withSYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.
– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Thanks for the quick reply, this is very close but I think a piece is missing here. It's only including companies that have an exact link to a companysector. For instance, companies 2 and 3 are not inheriting the sector from company 1, their parent company.
– Alex03
Mar 28 at 18:12
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
Ugh, sorry, that first join should be an outer join. Updated!
– Dave Costa
Mar 28 at 18:37
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
No apology needed! This is sooooo close. I don't think I explained correctly that children should inherit sectors all the way up until it finds a non null value, not just from their direct parent. So company 3 should pull the sector from two levels up (company 1). In your query company 3 has a null sector. I'm fiddling with it and can't quite get it.
– Alex03
Mar 28 at 18:49
Try replacing the
NVL
expression with SYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.– Dave Costa
Mar 28 at 20:09
Try replacing the
NVL
expression with SYS_CONNECT_BY_PATH(sector,'/')
. That should give you a string with the sector values from all ancestor records. Then hopefully you can parse out the last non-NULL value.– Dave Costa
Mar 28 at 20:09
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
I went with REGEXP_SUBSTR(trim(trailing '.' FROM SYS_CONNECT_BY_PATH(sector,'.')), '[^.]+$') AS sector This is exactly what I was looking for. The efficiency is up for debate, but it's cleaner than what I had. Thanks!
– Alex03
Mar 28 at 20:50
add a comment
|
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55403757%2fhierarchical-query-child-override%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown