2010-02-09 76 views
3

我需要找出SQL中查询父/子关系的最佳方法。一些父字段将成为孩子的数据。这里是一个例子:SQL中的父级子记录关系?

ID  Field1  Field2   ParentId 
-------------------------------------------- 
1  stuff  moreStuff  0 
2  childStuff (from parent) 1 

所以,一个孩子的Field2将是任何父母的价值。我需要弄清楚如何编写我的SQL,这样当记录被取消时,Field @对于孩子来说就是“moreStuff”。我正在使用SQL Server 2008. 谢谢。

+1

缺少规范:查询应该是递归还是只有一个级别?换句话说,如果一个行的父母也有一个父母,那么孩子应该得到祖父母的Field2还是父母的Field2? – 2010-02-09 13:41:16

回答

2

假设字段2不能为空,你可以使用LEFT JOIN与COALESCE:

SELECT T1.ID, T1.Field1, COALESCE(T2.Field2, T1.Field2) AS Field2, T1.ParentID 
FROM Table1 T1 
LEFT JOIN Table1 T2 
ON T1.ParentID = T2.ID 

如果字段2可以为NULL,用以下替换合并表达式:

CASE WHEN T2.Id IS NULL THEN T1.Field2 ELSE T2.Field2 END AS Field2 
1

在这种情况下,自加入应该为你做好诀窍。

SELECT child.ID, 
     child.Field1, 
     parent.Field2, 
     child.ParentID 
FROM MyTable child JOIN MyTable parent ON child.ParentID = parent.ID 
1

使用表上的self join

SELECT parent.Field1, parent.Field2, child.ID 
FROM myTable child 
    INNER JOIN myTable parent 
    ON child.ParentId = parent.ID 
1

这种分层查询通常有一个根节点,一个原动力,一个不是自己孩子的父母。也就是说,记录ParentId为空(或者在你的情况下为0,我认为它不是真实的ID)。如果这样在这里你需要使用一个外连接的情况下,而不是内部的那个......

SELECT parent.Field1, parent.Field2, child.ID 
FROM myTable child 
    LEFT OUTER JOIN myTable parent 
    ON child.ParentId = parent.ID 
/
+0

你是对的。我使用0作为ParentID,假设它不能为null,如果设置为0,它没有父项。谢谢! – DDiVita 2010-02-09 15:42:19

+0

@DDiVita - 使用0有问题,因为这意味着您无法使用外键强制执行父子关系。 NULL很麻烦,但是魔法值更糟。 – APC 2010-02-09 15:45:10