Mysql 关于自连接的Sql问题
我对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 3Mysql 关于自连接的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
其中一个限制是我无法更改数据模型,因为数据模型是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中是新事物吗?我不知道。你有链接吗?