SQL中的父子记录关系?
我需要找出在SQL中查询父/子关系的最佳方法。一些父字段将是子字段的数据。以下是一个例子:SQL中的父子记录关系?,sql,sql-server,Sql,Sql Server,我需要找出在SQL中查询父/子关系的最佳方法。一些父字段将是子字段的数据。以下是一个例子: ID Field1 Field2 ParentId -------------------------------------------- 1 stuff moreStuff 0 2 childStuff (from parent) 1 因此,对于一个孩子来说,字段2就是父母的值。我需要弄清楚如何编写我的SQL,这样
ID Field1 Field2 ParentId
--------------------------------------------
1 stuff moreStuff 0
2 childStuff (from parent) 1
因此,对于一个孩子来说,字段2就是父母的值。我需要弄清楚如何编写我的SQL,这样当记录被拉回时,孩子的字段@将是“moreStuff”。我正在使用SQLServer2008。
谢谢。在这种情况下,自我加入应该可以帮到你
SELECT child.ID,
child.Field1,
parent.Field2,
child.ParentID
FROM MyTable child JOIN MyTable parent ON child.ParentID = parent.ID
在桌子上使用一个按钮:
SELECT parent.Field1, parent.Field2, child.ID
FROM myTable child
INNER JOIN myTable parent
ON child.ParentId = parent.ID
假设Field2不能为NULL,则可以将左连接与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
这类分层查询通常有一个根节点、一个原动机、一个本身不是子节点的父节点。也就是说,
ParentId
为null的记录(或者在您的情况下为0,我认为它不是真实的ID)。如果是这种情况,您需要使用外部连接而不是内部连接
SELECT parent.Field1, parent.Field2, child.ID
FROM myTable child
LEFT OUTER JOIN myTable parent
ON child.ParentId = parent.ID
/
这是一篇关于在面向共享PHP/MySQL用户的数据库中存储分层数据的非常好的文章:缺少规范:查询应该是递归的还是只有一个级别?换句话说,如果一行的父项也有父项,那么孩子应该得到祖父母的字段2还是父项的字段2?你是对的。我使用0作为ParentID,假设它不能为null,如果设置为0,则它没有父项。谢谢@DDiVita-使用0是有问题的,因为这意味着您无法使用外键强制父子关系。NULL很麻烦,但魔法值更糟糕。