Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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
Mysql 关于自连接的Sql问题_Mysql_Sql_Self Join - Fatal编程技术网

Mysql 关于自连接的Sql问题

Mysql 关于自连接的Sql问题,mysql,sql,self-join,Mysql,Sql,Self Join,我对MySQL的SQL连接有疑问 假设我有下表A和父子关系。如何获得给定父id的所有子项(包括子项到叶节点的子项) Table A child id parent id 1 1 2 1 3 1 4 2 5 3 8 9 表A 子id父id 1 1 2 1 3 1 4 2

我对MySQL的SQL连接有疑问

假设我有下表A和父子关系。如何获得给定父id的所有子项(包括子项到叶节点的子项)

Table A child id parent id 1 1 2 1 3 1 4 2 5 3 8 9 表A 子id父id 1 1 2 1 3 1 4 2 5 3 8 9 从上表中,如果我们给定父(1),我必须进行查询,以便给定父id(1),它将给出所有层次结构示例:

child id parent id 1 1 2 1 3 1 4 2 5 3 子id父id 1 1 2 1 3 1 4 2 5 3
其中一个限制是我无法更改数据模型,因为数据模型是JBPM数据库表(开源)。我正在为子进程(每个扇出进程)的JBPM图形中添加ProcessInstancelog表的一些功能。

您似乎希望能够选择父进程,然后获取其所有子进程,无论其在层次结构中的位置如何

最有效的方法是使用反向关联表。其中,在到达树的根之前,每个子级都将与其父级、授予父级等相关联

这显然意味着您必须在写操作上做更多的工作来维护表,但这样可以避免查询表的复杂性

范例

id       parent
1        0
2        1
3        1
4        2
反向工作台

child     parent    level
2         1         1
3         1         1
4         2         1
4         1         2

有了它,您可以在查询中使用(select child where parent=1)进行子选择。

您可以在sql中这样做

CREATE TABLE [dbo].[Employee](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NULL,
[managerId] [int] NULL,

)  

  WITH UserCTE AS (
    SELECT id, name, managerId,0 AS steps
     FROM dbo.[Employee]
     WHERE id = 1 

 UNION ALL

  SELECT mgr.id, mgr.name, mgr.managerId, usr.steps +1 AS steps
  FROM UserCTE AS usr
   INNER JOIN dbo.[Employee] AS mgr
     ON usr.managerId = mgr.id
)
SELECT * FROM UserCTE  order by id; 

据我所知,在MySQL中,如果不使用游标/多个查询,这是不可能的。可能是我,但我看不出你想要什么?“给所有孩子一个父id”,这意味着一个简单的
,其中父id=x
。第二个表看起来相同,但缺少最后一行。我错过什么了吗?你到底想要什么?你想要递归的所有子节点?在Oracle(我想还有Postgres)中,你可以在一个查询中对叶节点进行分层选择。不仅仅是直接的孩子,还有那些孩子的孩子,还有那些孩子的孩子的孩子等等@Magnus-这在SQL Server 2008中是新事物吗?我不知道。你有链接吗?