| Author |
Topic |
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 07:08:21
|
| Hello Everyone,I've following tablePersonID PersonName FatherPersonID MotherPersonID1 Bob 4 52 Carol 4 53 Jennifer 4 54 Frank 9 105 Michelle 11 126 Keith 3 137 Natasha 3 138 Alice 2 149 Patrick 10 Julie 11 Jim 12 Anne 13 David 15 1614 Raymond 15 Eric 16 Natalie I want to write a SELECT statement to extract the names of all of Bob’s grandparentsThis is what I have doneSelect gf.PersonName As GrandFather, gm.PersonName As GrandMotherFrom Person gf, Person gm, Person f, Person m, Person b Where(gf.PersonId = f.FatherPersonId ORgf.PersonId = m.FatherPersonId) AND(gm.PersonId = f.MotherPersonId ORgm.PersonId = m.MotherPersonId) ANDf.PersonId = b.FatherPersonId ANDm.PersonId = b.MotherPersonId ANDb.PersonId = 1 --Bobbut the query result is not perfect.Please can someone advice me the correct query using both implicit and explicit join.many thanks |
|
|
jackv
Master Smack Fu Yak Hacker
2179 Posts |
Posted - 2007-10-06 : 08:07:15
|
| Select gf.PersonName As GrandFather,mf.PersonName As GrandMotherFROM myTable as mINNER JOIN (SELECT FatherPersonID,motherPersonID FROM myTable) as f ON m.FatherPersonID = f.FatherPersonID AND m.MotherPersonID = f.MotherPersonID INNER JOIN (SELECT FatherPersonID,fatherPerson FROM myTable) as gf ON f.fatherPersonID = gf.FatherPersonID AND f.motherPeronID = f2.motherPersonIDINNER JOIN (SELECT MotherPersonID,person FROM myTable) as mf ON f.motherPersonID = mf.MotherPersonID WHERE m.PersonID =1Jack Vamvas--------------------http://www.sqlserver-dba.com |
 |
|
|
Kristen
Test
22859 Posts |
Posted - 2007-10-06 : 08:08:36
|
| [code]DECLARE @Person TABLE( PersonID int NOT NULL, PersonName varchar(20), FatherPersonID int, MotherPersonID int)-- PersonID PersonName FatherPersonID MotherPersonIDINSERT INTO @PersonSELECT 1, 'Bob', 4, 5 UNION ALLSELECT 2, 'Carol', 4, 5 UNION ALLSELECT 3, 'Jennifer', 4, 5 UNION ALLSELECT 4, 'Frank', 9, 10 UNION ALLSELECT 5, 'Michelle', 11, 12 UNION ALLSELECT 6, 'Keith', 3, 13 UNION ALLSELECT 7, 'Natasha', 3, 13 UNION ALLSELECT 8, 'Alice', 2, 14 UNION ALLSELECT 9, 'Patrick', NULL, NULL UNION ALLSELECT 10, 'Julie', NULL, NULL UNION ALLSELECT 11, 'Jim', NULL, NULL UNION ALLSELECT 12, 'Anne', NULL, NULL UNION ALLSELECT 13, 'David', 15, 16 UNION ALLSELECT 14, 'Raymond', NULL, NULL UNION ALLSELECT 15, 'Eric', NULL, NULL UNION ALLSELECT 16, 'Natalie', NULL, NULLSELECT [Person] = P.PersonName, [Mother] = M.PersonName, [Father] = F.PersonName, [Mother's Mother] = MM.PersonName, [Mother's Father] = MF.PersonName, [Father's Mother] = FM.PersonName, [Father's Father] = FF.PersonNameFROM @Person AS P LEFT OUTER JOIN @Person AS M -- Mother ON M.PersonID = P.MotherPersonID LEFT OUTER JOIN @Person AS F -- Father ON F.PersonID = P.FatherPersonID LEFT OUTER JOIN @Person AS MM -- Mother's Mother ON MM.PersonID = M.MotherPersonID LEFT OUTER JOIN @Person AS MF -- Mother's Father ON MF.PersonID = M.FatherPersonID LEFT OUTER JOIN @Person AS FM -- Father's Mother ON FM.PersonID = F.MotherPersonID LEFT OUTER JOIN @Person AS FF -- Father's Father ON FF.PersonID = F.FatherPersonIDWHERE P.PersonId = 1 --Bob[/code] |
 |
|
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 08:15:31
|
quote: Originally posted by jackv Select gf.PersonName As GrandFather,mf.PersonName As GrandMotherFROM myTable as mINNER JOIN (SELECT FatherPersonID,motherPersonID FROM myTable) as f ON m.FatherPersonID = f.FatherPersonID AND m.MotherPersonID = f.MotherPersonID INNER JOIN (SELECT FatherPersonID,fatherPerson FROM myTable) as gf ON f.fatherPersonID = gf.FatherPersonID AND f.motherPeronID = f2.motherPersonIDINNER JOIN (SELECT MotherPersonID,person FROM myTable) as mf ON f.motherPersonID = mf.MotherPersonID WHERE m.PersonID =1Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL
Jack this is incorrect query here is what i getMsg 207, Level 16, State 1, Line 6Invalid column name 'fatherPerson'.Msg 207, Level 16, State 1, Line 7Invalid column name 'motherPeronID'.Msg 4104, Level 16, State 1, Line 7The multi-part identifier "f2.motherPersonID" could not be bound.Msg 207, Level 16, State 1, Line 8Invalid column name 'person'.Msg 207, Level 16, State 1, Line 2Invalid column name 'PersonName'.Msg 207, Level 16, State 1, Line 2Invalid column name 'PersonName'. |
 |
|
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 08:18:41
|
quote: Originally posted by Kristen
DECLARE @Person TABLE( PersonID int NOT NULL, PersonName varchar(20), FatherPersonID int, MotherPersonID int)-- PersonID PersonName FatherPersonID MotherPersonIDINSERT INTO @PersonSELECT 1, 'Bob', 4, 5 UNION ALLSELECT 2, 'Carol', 4, 5 UNION ALLSELECT 3, 'Jennifer', 4, 5 UNION ALLSELECT 4, 'Frank', 9, 10 UNION ALLSELECT 5, 'Michelle', 11, 12 UNION ALLSELECT 6, 'Keith', 3, 13 UNION ALLSELECT 7, 'Natasha', 3, 13 UNION ALLSELECT 8, 'Alice', 2, 14 UNION ALLSELECT 9, 'Patrick', NULL, NULL UNION ALLSELECT 10, 'Julie', NULL, NULL UNION ALLSELECT 11, 'Jim', NULL, NULL UNION ALLSELECT 12, 'Anne', NULL, NULL UNION ALLSELECT 13, 'David', 15, 16 UNION ALLSELECT 14, 'Raymond', NULL, NULL UNION ALLSELECT 15, 'Eric', NULL, NULL UNION ALLSELECT 16, 'Natalie', NULL, NULLSELECT [Person] = P.PersonName, [Mother] = M.PersonName, [Father] = F.PersonName, [Mother's Mother] = MM.PersonName, [Mother's Father] = MF.PersonName, [Father's Mother] = FM.PersonName, [Father's Father] = FF.PersonNameFROM @Person AS P LEFT OUTER JOIN @Person AS M -- Mother ON M.PersonID = P.MotherPersonID LEFT OUTER JOIN @Person AS F -- Father ON F.PersonID = P.FatherPersonID LEFT OUTER JOIN @Person AS MM -- Mother's Mother ON MM.PersonID = M.MotherPersonID LEFT OUTER JOIN @Person AS MF -- Mother's Father ON MF.PersonID = M.FatherPersonID LEFT OUTER JOIN @Person AS FM -- Father's Mother ON FM.PersonID = F.MotherPersonID LEFT OUTER JOIN @Person AS FF -- Father's Father ON FF.PersonID = F.FatherPersonIDWHERE P.PersonId = 1 --Bob
This is correct... but can you advice what I have done wrong in the implict join query belowSelect gf.PersonName As GrandFather, gm.PersonName As GrandMotherFrom Person gf, Person gm, Person f, Person m, Person b Where(gf.PersonId = f.FatherPersonId ORgf.PersonId = m.FatherPersonId) AND(gm.PersonId = f.MotherPersonId ORgm.PersonId = m.MotherPersonId) ANDf.PersonId = b.FatherPersonId ANDm.PersonId = b.MotherPersonId ANDb.PersonId = 1 --Bob |
 |
|
|
jackv
Master Smack Fu Yak Hacker
2179 Posts |
Posted - 2007-10-06 : 08:20:24
|
| OK, try this one , I had a few mispellings.Select gf.PersonName As GrandFather,mf.PersonName As GrandMotherFROM myTable as mINNER JOIN (SELECT FatherPersonID,motherPersonID FROM myTable) as f ON m.FatherPersonID = f.FatherPersonID AND m.MotherPersonID = f.MotherPersonID INNER JOIN (SELECT FatherPersonID,PersonName FROM myTable) as gf ON f.fatherPersonID = gf.FatherPersonID AND f.motherPersonID = f.motherPersonIDINNER JOIN (SELECT MotherPersonID,PersonName FROM myTable) as mf ON f.motherPersonID = mf.MotherPersonID Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL |
 |
|
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 08:26:56
|
quote: Originally posted by jackv OK, try this one , I had a few mispellings.Select gf.PersonName As GrandFather,mf.PersonName As GrandMotherFROM myTable as mINNER JOIN (SELECT FatherPersonID,motherPersonID FROM myTable) as f ON m.FatherPersonID = f.FatherPersonID AND m.MotherPersonID = f.MotherPersonID INNER JOIN (SELECT FatherPersonID,PersonName FROM myTable) as gf ON f.fatherPersonID = gf.FatherPersonID AND f.motherPersonID = f.motherPersonIDINNER JOIN (SELECT MotherPersonID,PersonName FROM myTable) as mf ON f.motherPersonID = mf.MotherPersonID Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL
I've solved without using explict joinsSelect gf1.PersonName As [Father's Father], gm1.PersonName As [Father's Mother],gf2.PersonName As [Mother's Father], gm2.PersonName As [Mother's Mother]From Person gf1, Person gm1, Person gf2, Person gm2,Person f, Person m, Person b Wheregf1.PersonId = f.FatherPersonId ANDgm1.PersonId = f.MotherPersonId ANDgf2.PersonId = m.FatherPersonId ANDgm2.PersonId = m.MotherPersonId ANDf.PersonId = b.FatherPersonId ANDm.PersonId = b.MotherPersonId ANDb.PersonId = 1 --Bob |
 |
|
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 08:28:56
|
quote: Originally posted by jackv OK, try this one , I had a few mispellings.Select gf.PersonName As GrandFather,mf.PersonName As GrandMotherFROM myTable as mINNER JOIN (SELECT FatherPersonID,motherPersonID FROM myTable) as f ON m.FatherPersonID = f.FatherPersonID AND m.MotherPersonID = f.MotherPersonID INNER JOIN (SELECT FatherPersonID,PersonName FROM myTable) as gf ON f.fatherPersonID = gf.FatherPersonID AND f.motherPersonID = f.motherPersonIDINNER JOIN (SELECT MotherPersonID,PersonName FROM myTable) as mf ON f.motherPersonID = mf.MotherPersonID Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL
this is not correct yet..... it shows 101 rows in the result set |
 |
|
|
jackv
Master Smack Fu Yak Hacker
2179 Posts |
Posted - 2007-10-06 : 08:31:39
|
| add "WHERE m.PersonId = 1"Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL |
 |
|
|
bhav27
Starting Member
8 Posts |
Posted - 2007-10-06 : 08:36:13
|
quote: Originally posted by jackv add "WHERE m.PersonId = 1"Jack Vamvas--------------------Search IT jobs from multiple sources- http://www.ITjobfeed.com/SQL
dude try thisSELECT [Person] = P.PersonName, [Mother] = M.PersonName, [Father] = F.PersonName, [Mother's Mother] = MM.PersonName, [Mother's Father] = MF.PersonName, [Father's Mother] = FM.PersonName, [Father's Father] = FF.PersonNameFROM @Person AS P INNER JOIN @Person AS M -- Mother ON M.PersonID = P.MotherPersonID INNER JOIN @Person AS F -- Father ON F.PersonID = P.FatherPersonID INNER JOIN @Person AS MM -- Mother's Mother ON MM.PersonID = M.MotherPersonID INNER JOIN @Person AS MF -- Mother's Father ON MF.PersonID = M.FatherPersonID INNER JOIN @Person AS FM -- Father's Mother ON FM.PersonID = F.MotherPersonID INNER JOIN @Person AS FF -- Father's Father ON FF.PersonID = F.FatherPersonIDWHERE P.PersonId = 1 --Bobjust replaced LEFT OUTER JOIN to INNER JOIN from kristen's reply |
 |
|
|
masteripper
Starting Member
25 Posts |
Posted - 2011-06-14 : 03:22:42
|
| Well it should go something like this (is not perfect)WITH GrandFather(ChildID, GrandChildName, GrandFatherID,iteration) AS( SELECT p.PersonID, p.PersonName, p.PersonID, 0 FROM person p WHERE p.FatherPersonID IS NULL UNION ALL SELECT p1.PersonID, p1.PersonName, f.GrandFatherID, f.iteration+1 FROM person p1 INNER JOIN Grandfather f ON p1.FatherPersonId = f.ChildID)SELECT Grandfather.*,p1.personname as GrandFatherNameFROM Grandfather INNER JOIN Person p1ON Grandfather.GrandfatherID = p1.personIDWHERE Grandfather.iteration =2Well this work when the table person is like thisINSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(1,'Bob',4,5)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(2,'Carol',4,5)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(3,'Jennifer',4,5)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(4,'Frank',9,10)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(5,'Michelle',11,12)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(6,'Keith',11,12)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(7,'Natasha',11,12)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(8,'Alice',15,16)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(9,'Patrick',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(10,'Julie',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(11,'Jim',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(12,'Anne',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(13,'David',15,16)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(14,'Raymond',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(15,'Eric',NULL,NULL)INSERT INTO [person] ([PersonID],[PersonName],[FatherPersonID],[MotherPersonID])VALUES(16,'Natalie',NULL,NULL) |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2011-06-14 : 03:31:32
|
FYI. You just dig out a 4 year old thread. KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
masteripper
Starting Member
25 Posts |
Posted - 2011-06-14 : 06:08:56
|
| Well my bad....i was searching for something......and mistakes happen |
 |
|
|
|
|
|