1

我正在使用 sql server 2008 在 asp.net 中开发家谱应用程序。

我的主表是这样的:-

ID int PK
Name Varchar(50)
MotherID int
FatherID int

ID  MotherID FatherID   Name

1   NULL    NULL    My Grand Father

2   NULL    NULL    My Grand Mother

3   someid  someid  My Mother

4   2   1   My Father

5   3   4   Me

6   someid  someid  My wife

7   3   4   My Brother

8   6   5   My son.

我正在寻找这样的输出

ID  MotherID    FatherID    Name        Level

1   someid  someid  grandfather 0


2   someid  someid  Father      1

3   someid  someid  Me      2


4   someid  someid  Brother     2

5   someid  someid  My Son      3

提前致谢。克什米尔。

4

2 回答 2

4

尝试这个:

;WITH FamilyCTE
AS
(
    SELECT 
      *, 
      CAST(NULL AS VARCHAR(50)) AS FatherName,  
      CAST(NULL AS VARCHAR(50)) AS MotherName, 0 AS Level
    FROM @FamilyTree
    WHERE FatherID IS NULL 
      AND MotherID IS NULL
    UNION ALL
    SELECT 
      f.ID, 
      f.Name AS ParentName, 
      f.MotherID, 
      f.FatherID, 
      c.Name AS FatherName, 
      c2.Name AS MotherName, 
      Level + 1
    FROM @FamilyTree AS F
    INNER JOIN FamilyCTE c ON F.FatherID = c.ID
    INNER JOIN @FamilyTree c2 ON f.MotherID = c2.ID
)

SELECT * FROM FamilyCTE

演示

如果想获得与您在问题中发布的内容一样的确切输出,只需忽略FatherNameandMotherName并将选择限制为SELECT * FROM FamilyCTE您要选择的列WHERE ID = 1,例如使用锚查询中的起始祖父。如以下演示所示:

演示

于 2012-11-01T06:55:46.680 回答
0
select t1.ID, t1.MotherID, 
t1.FatherID,
t1.name, 
t2.Name,
Level
from table1 t1
left outer join table2 t2 on t1.FatherID =t2.FatherID 
于 2012-11-01T06:25:15.417 回答