We help IT Professionals succeed at work.

MS SQL - How do I fetch the same column twice from one table?

Medium Priority
611 Views
Last Modified: 2012-08-14
Hi,

I have two tables. One has a full list of IDs with their descriptions, the other lists the relationship between the IDs. I realise this sounds a little cryptic so I'll try and illustrate it in the code section.

What I need to do is have a full list of IDs with their parent and child descriptions...see desired result table in the coding section.
Table 1:
ID     Descr
1      James
2      Philip
3      Peter
4      Allan
 
Table 2:
ID     ChildID
1      2
1      3
2      NULL
3      4
4      NULL
 
Desired Result:
ID    ParentDescr     ChildDescr
1     James               Philip
1     James               Peter
2     Philip                 NULL
3     Peter                 Allan
4     Allan                 NULL

Open in new window

Comment
Watch Question

Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
Something like this should work:
select p.ID, p.Descr AS ParentDescr, c.Descr AS ChildDescr
from Table1 p
inner join Table2 pc ON pc.ID = p.ID
left join Table1 c ON pc.ChildID = c.ID

Open in new window

Author

Commented:
thanks, my issue was how to query the same table twice for the descriptions of the child and parent IDs but it looks like this sorts it - i'll comment tomorrow when i'm back in the office.

thanks again!

Commented:
Select c.ID, C.Desc ParentDescr, m.ChildID, m.Descr as ChildDescr
From Table1 c INNER JOIN (
Select a.ID, a.ChildID, t.Descr
From  Table1 t INNER JOIN  Table2 d
           ON t.ID = ChildID
Where ChildID IS NOT NULL) as m
ON c.ID = m.Id

Commented:
I am really slow today... :-)
Racim BOUDJAKDJIDatabase Architect - Dba - Data Scientist
CERTIFIED EXPERT

Commented:

Alternatively...Something like this should work...
select ALL.*
from
(
select A.id, A.Descr as ParentDescr, C.Descr as ChildDescr from table1 A inner join table2 B on  A.id = B.id inner join table1 C on B.ChildID = C.id where B.ChildID is not null
union all
select A.id, A.Descr, NULL from table1 A inner join table2 B on  A.id = B.id where B.ChildID is null
) ALL
order by ALL.id

HTH

Author

Commented:
Right i'm still a little stuck, see the code snippet...

It looks like its listing all part groups for every product when what I want it to do is only list its relevent group. Each part can be in a number of product groups but it's usually 1. Thus it will then list the child group.

Any ideas?
SELECT     epar.part AS PartCode, p.prod_group, c.prod_group AS child_group, p.descr AS ParentDescr, c.descr AS ChildDescr
FROM         epar LEFT OUTER JOIN
                      wgrp_part ON epar.part = wgrp_part.part INNER JOIN
                      wgrp AS p ON wgrp_part.prod_group = p.prod_group INNER JOIN
                      wgrp_sgrp AS pc ON pc.Prod_group = p.prod_group LEFT OUTER JOIN
                      wgrp AS c ON pc.sub_group = c.prod_group
WHERE     (c.descr IS NOT NULL)
ORDER BY epar.part

Open in new window

Author

Commented:
by the way...
epar - lists all parts.
wgrp_part - lists all parts and their prod_groups.
wgrp_sgrp - lists all sub_groups and their respective prod_group.
wgrp - lists all prod_groups and sub_groups descriptions.

Commented:
Sorry, but I am a little confused. Can you please post some sample data from the tables we can work with?
P.
Chief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Commented:
I would recommend accepting mvisa's answer since it was answered based on what was requested.
P.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.