Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的父子记录关系?_Sql_Sql Server - Fatal编程技术网

SQL中的父子记录关系?

SQL中的父子记录关系?,sql,sql-server,Sql,Sql Server,我需要找出在SQL中查询父/子关系的最佳方法。一些父字段将是子字段的数据。以下是一个例子: ID Field1 Field2 ParentId -------------------------------------------- 1 stuff moreStuff 0 2 childStuff (from parent) 1 因此,对于一个孩子来说,字段2就是父母的值。我需要弄清楚如何编写我的SQL,这样

我需要找出在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很麻烦,但魔法值更糟糕。