Author |
Topic |
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 09:42:07
|
So I have tblJobItem with fieldsJobItemName, JobItemSublevel, JobItemParent, JobItemChild1, JobItemChild2JobItemName is the name of item namesublevel goes from 0 - 3if sublevel is 0 then parent, child1, child2 are nullif sublevel is 1 then child1, child2 are null and parent is value of sublevel 0 jobitemnameif sublevel is 2 then child2 is null and parent is value of sublevel 0 jobitemname and child1 is name of sublevel 1 jobitemnameall that said Im trying to write a recursive query to get he heirachy structure -- the following gives me an error that there is no anchor query for tbljobitemWITH tblJobItem (JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName) AS (SELECT a.JobItemName, a.JobItemSubLevel, a.JobItemParentName, a.JobItemChildName FROM tblJobItem AS a UNION ALLSELECT a.JobItemName, b.JobItemSubLevel, a.JobItemParentName, a.JobItemChildNameFROM tblJobItem AS a INNER JOIN tblJobItem AS b ON a.jobitemsublevel = b.JobItemSubLevel)SELECT * FROM tbljobitemORDER BY JobItemIDIDhow do i make this work with the table structure provided. |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 09:42:58
|
The anchor point (query above UNION ALL) needs a WHERE. E 12°55'05.25"N 56°04'39.16" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 09:45:57
|
[code];WITH Yak (JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName)AS ( SELECT JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName FROM tblJobItem WHERE <> UNION ALL SELECT a.JobItemName, b.JobItemSubLevel, a.JobItemParentName, a.JobItemChildName FROM tblJobItem AS a INNER JOIN Yak AS b ON a.JobItemSubLevel = b.JobItemSubLevel + 1 -- Could be -1)SELECT JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildNameFROM YakORDER BY JobItemIDID[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 09:47:00
|
how would i loop through the entire heirarchy?it goes sublevel0 - parent1 - child2221 - new child20 -- new parent1 -- new child2 |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 09:50:20
|
Can you post some relevant sample data from your table, so I don't have to randomize something up?Please post as insert statements with table DDL. E 12°55'05.25"N 56°04'39.16" |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 09:53:34
|
WHERE <>gives me a syntax error |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 10:05:09
|
CREATE TABLE JobItemName(JobItemID int,JobItemName varchar(100), JobItemSubLevel int, JobItemParentName varchar(100), JobItemChildName varchar(100), JobItemChild2Name varchar(100))insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('200', '0', '','','')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.000 GENERAL CONDITIONS', '1', '200','','')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.101 GENERAL SUPERINTENDENT', '2', '200','01.000 GENERAL CONDITIONS','')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.101 Equipment', '3', '200','01.000 GENERAL CONDITIONS','01.101 GENERAL SUPERINTENDENT')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.101 Labor', '3', '200','01.000 GENERAL CONDITIONS','01.101 GENERAL SUPERINTENDENT')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.101 Other', '3', '200','01.000 GENERAL CONDITIONS','01.101 GENERAL SUPERINTENDENT')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.102 SUPERINTENDENT', '2', '200','01.000 GENERAL CONDITIONS','')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.102 Equipment', '3', '200','01.000 GENERAL CONDITIONS','01.102 SUPERINTENDENT')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('01.102 Labor', '3', '200','01.000 GENERAL CONDITIONS','01.102 SUPERINTENDENT')insert into tbljobitem (jobitemname, jobitemsublevel, jobitemparentname, jobitemchildname, jobitemchild2name)values('02.000 GENERAL Products', '1', '200','','')etc |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 10:08:06
|
[code]DECLARE @Sample TABLE (ID INT, ParentID INT, Name VARCHAR(1000))INSERT @SampleSELECT 7, NULL, 'Ljunggren' UNION ALLSELECT 3, 1, 'Gulli' UNION ALLSELECT 8, 7, 'Kerstin' UNION ALLSELECT 1, NULL, 'Rosberg' UNION ALLSELECT 4, 2, 'Peter' UNION ALLSELECT 5, 3, 'Susanne' UNION ALLSELECT 2, 1, 'Jan-Eric' UNION ALLSELECT 10, 9, 'Jennie' UNION ALLSELECT 6, 3, 'Annelie' UNION ALLSELECT 9, 7, 'Kenneth' UNION ALLSELECT 11, 9, 'Jessica';WITH Yak (ID, ParentID, Name, Path, Indent)AS ( SELECT ID, ParentID, Name, CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY Name)), 0 FROM @Sample WHERE ParentID IS NULL UNION ALL SELECT s.ID, s.ParentID, s.Name, CONVERT(VARCHAR, y.Path + ',' + CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY s.Name DESC))), y.Indent + 1 FROM @Sample AS s INNER JOIN Yak AS y ON y.ID = s.ParentID)SELECT ID, Name, ParentID, IndentFROM YakORDER BY Path[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 10:08:46
|
quote: Originally posted by tpiazza55 WHERE <>gives me a syntax error
Of course! I told you to put a valid WHERE statement.I don't know your envionment so you have to put in a little bit of effort yourself. E 12°55'05.25"N 56°04'39.16" |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 10:20:47
|
i know about the where statement -- thought about that right after i clicked it |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 10:42:33
|
i get an infinite loop on this WITH Yak (JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName)AS ( SELECT JobItemName, 0, JobItemParentName, JobItemChildName FROM tblJobItem WHERE JobItemParentName is null UNION ALL SELECT a.JobItemName, b.JobItemSubLevel, a.JobItemParentName, a.JobItemChildName FROM tblJobItem AS a INNER JOIN Yak AS b ON a.JobItemSubLevel = b.JobItemSubLevel + 1 )SELECT JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildNameFROM Yak |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 11:03:58
|
Your data is already organized in a hierarchy! You should have seen this.All you have to do is some advanced ORDER BY.-- Prepare sample dataDECLARE @Job TABLE ( JobItemID INT, JobItemName VARCHAR(100), JobItemSubLevel INT, JobItemParentName VARCHAR(100), JobItemChildName VARCHAR(100), JobItemChild2Name VARCHAR(100) )INSERT @Job ( JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2Name )SELECT '200', '0', '', '', '' UNION ALLSELECT '01.000 GENERAL CONDITIONS', '1', '200', '', '' UNION ALLSELECT '01.101 GENERAL SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.101 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Other', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.102 SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.102 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '01.102 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '02.000 GENERAL Products', '1', '200', '', ''-- Show the expexted outputSELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2NameFROM @JobORDER BY CASE WHEN JobItemSubLevel = 0 THEN CAST(JobItemName AS INT) ELSE JobItemSubLevel END, CASE WHEN JobItemSubLevel = 0 THEN 0 ELSE 1 END, JobItemName E 12°55'05.25"N 56°04'39.16" |
 |
|
tpiazza55
Posting Yak Master
162 Posts |
Posted - 2007-08-30 : 11:27:01
|
i know this is heirarchial -- i have to join it on a project and compare the jobitems and get those 2 tables linked with a recursive queryjust trying to get a handle on how it works |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 11:47:59
|
I can see that, but your data DOES NOT NEED recursive query!You are limited to three levels only due to table design.DECLARE @Job TABLE ( JobItemID INT, JobItemName VARCHAR(100), JobItemSubLevel INT, JobItemParentName VARCHAR(100), JobItemChildName VARCHAR(100), JobItemChild2Name VARCHAR(100) )INSERT @Job ( JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName, JobItemChild2Name )SELECT '200', '0', '', '', '' UNION ALLSELECT '01.000 GENERAL CONDITIONS', '1', '200', '', '' UNION ALLSELECT '01.101 GENERAL SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.101 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Other', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.102 SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.102 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '01.102 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '02.000 GENERAL Products', '1', '200', '', ''SELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2NameFROM @JobORDER BY CASE WHEN JobItemSubLevel = 0 THEN JobItemParentName ELSE JobItemName END, CASE WHEN JobItemSubLevel = 0 THEN 0 ELSE 1 END, JobItemName If you want to learn recursive CTE, use the example I posted above. E 12°55'05.25"N 56°04'39.16" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 11:53:36
|
Here is a recursive CTE for your data above. Please notice that the output is crazier to handle!You need to distinct the data.And you still have to sort ORDER BY exactly as before in my posts above.Do you see? It is how your data is stored that mattersDECLARE @Job TABLE ( JobItemID INT, JobItemName VARCHAR(100), JobItemSubLevel INT, JobItemParentName VARCHAR(100), JobItemChildName VARCHAR(100), JobItemChild2Name VARCHAR(100) )INSERT @Job ( JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName, JobItemChild2Name )SELECT '200', '0', '', '', '' UNION ALLSELECT '01.000 GENERAL CONDITIONS', '1', '200', '', '' UNION ALLSELECT '01.101 GENERAL SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.101 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Other', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.102 SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.102 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '01.102 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '02.000 GENERAL Products', '1', '200', '', '';WITH Yak (JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2Name)AS ( SELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2Name FROM @Job WHERE JobItemSubLevel = 0 UNION ALL SELECT j.JobItemID, j.JobItemName, j.JobItemParentName, j.JobItemSubLevel, j.JobItemChildName, j.JobItemChild2Name FROM @Job AS j INNER JOIN Yak AS y ON y.JobItemSubLevel = j.JobItemSubLevel - 1)SELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2NameFROM (SELECT DISTINCT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2NameFROM Yak) AS pesoORDER BY CASE WHEN JobItemSubLevel = 0 THEN JobItemParentName ELSE JobItemName END, CASE WHEN JobItemSubLevel = 0 THEN 0 ELSE 1 END, JobItemName E 12°55'05.25"N 56°04'39.16" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-08-30 : 11:59:53
|
Here is a way to remove the DISTINCT part. But beware of the WHERE clause in the recursive part of the CTE!Do you now see how your data is stored? DECLARE @Job TABLE ( JobItemID INT, JobItemName VARCHAR(100), JobItemSubLevel INT, JobItemParentName VARCHAR(100), JobItemChildName VARCHAR(100), JobItemChild2Name VARCHAR(100) )INSERT @Job ( JobItemName, JobItemSubLevel, JobItemParentName, JobItemChildName, JobItemChild2Name )SELECT '200', '0', '', '', '' UNION ALLSELECT '01.000 GENERAL CONDITIONS', '1', '200', '', '' UNION ALLSELECT '01.101 GENERAL SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.101 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.101 Other', '3', '200', '01.000 GENERAL CONDITIONS', '01.101 GENERAL SUPERINTENDENT' UNION ALLSELECT '01.102 SUPERINTENDENT', '2', '200', '01.000 GENERAL CONDITIONS', '' UNION ALLSELECT '01.102 Equipment', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '01.102 Labor', '3', '200', '01.000 GENERAL CONDITIONS', '01.102 SUPERINTENDENT' UNION ALLSELECT '02.000 GENERAL Products', '1', '200', '', ''select * from @job;WITH Yak (JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2Name)AS ( SELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2Name FROM @Job WHERE JobItemSubLevel = 0 UNION ALL SELECT j.JobItemID, j.JobItemName, j.JobItemParentName, j.JobItemSubLevel, j.JobItemChildName, j.JobItemChild2Name FROM @Job AS j INNER JOIN Yak AS y ON y.JobItemSubLevel = j.JobItemSubLevel - 1 where j.JobItemSubLevel = 1 or (j.jobitemchildname = y.jobitemname and j.JobItemSubLevel = 2) or (j.jobitemchild2name = y.jobitemname and j.JobItemSubLevel = 3))SELECT JobItemID, JobItemName, JobItemParentName, JobItemSubLevel, JobItemChildName, JobItemChild2NameFROM YakORDER BY CASE WHEN JobItemSubLevel = 0 THEN JobItemParentName ELSE JobItemName END, CASE WHEN JobItemSubLevel = 0 THEN 0 ELSE 1 END, JobItemName and you still need the ugly sort thing... E 12°55'05.25"N 56°04'39.16" |
 |
|
|
|
|