SQL中的父子记录关系?

时间:2010-02-09 13:26:40

标签: sql sql-server

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

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

因此,孩子的Field2将是父母的价值。我需要弄清楚如何编写我的SQL,以便当记录被拉回时,Field @ for the child将是“moreStuff”。我正在使用SQL Server 2008。  谢谢。

5 个答案:

答案 0 :(得分:2)

假设Field2不能为NULL,您可以使用带COALESCE的LEFT JOIN:

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

如果Field2可以为NULL,请使用以下内容替换coalesce表达式:

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

答案 1 :(得分:1)

在这种情况下,自我加入应该可以帮到你。

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

答案 2 :(得分:1)

在桌子上使用self join

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

答案 3 :(得分:1)

这种分层查询通常有一个根节点,一个原动机,一个本身不是孩子的父母。也就是说,ParentId为空的记录(或者在你的情况下为0,我认为它不是真正的ID)。如果是这种情况,你需要使用OUTER连接而不是INNER连接...

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

答案 4 :(得分:1)

这是一篇关于在数据库中存储分层数据的相当不错的文章,该文章面向弱小的PHP / MySQL用户:http://articles.sitepoint.com/article/hierarchical-data-database