我对MySQL的SQL连接有疑问。
假设我有下表A和父子关系。如何给所有孩子(包括孩子的子孩子到叶子节点)给予父母身份?
Table A child id parent 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
其中一个限制是我无法更改数据模型,因为数据模型是JBPM数据库表(开源)我在JBPM图中为ProcessInstancelog表添加了一些功能,用于子流程(对于每个扇出流程)
答案 0 :(得分:1)
您希望能够选择父级,然后获取其所有子级,无论其位于层次结构中的哪个位置。
最有效的方法是使用反向关联表。其中每个子项将与其父项关联,授予父项,依此类推,直到到达树的根。
这显然意味着你必须在写入时做更多的工作来维护表,但它会使你免于查询表的复杂性。
实施例
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 parent where parent = 1)进行子选择
答案 1 :(得分:0)
你可以在这样的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;