我需要找出在SQL中查询父/子关系的最佳方法。一些父字段将是孩子的数据。这是一个例子:
ID Field1 Field2 ParentId
--------------------------------------------
1 stuff moreStuff 0
2 childStuff (from parent) 1
因此,孩子的Field2将是父母的价值。我需要弄清楚如何编写我的SQL,以便当记录被拉回时,Field @ for the child将是“moreStuff”。我正在使用SQL Server 2008。 谢谢。
答案 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