如何从两张关联表中获取指定ParentQuestionID的所有子级数据?
解决层级问答数据的子级查询问题
我来帮你搞定这个层级问答数据的查询问题!首先咱们先把表名明确下(你没给,我先假设两个合理的名字方便写SQL):
第一张表存储父问题与答案的关联,命名为ParentQuestion_Answer,结构如下:
ID | Parent_Question_ID | AnswerID
第二张表存储答案与子问题的关联,命名为Answer_SubQuestion,结构如下:
ID | AnswerID | Sub_Question_ID
根据你描述的层级关系——父问题对应多个答案,每个答案对应多个子问题,子问题又可以作为父问题继续关联答案和下一级子问题——最适合的方案是用**递归CTE(公共表表达式)**来实现全层级子数据的查询。
方案1:查询所有层级的子级数据(含多层嵌套)
如果需要获取指定父问题下的所有层级子数据(比如子问题的子问题也需要返回),可以用递归CTE:
WITH RecursiveQuestionHierarchy AS ( -- 锚点成员:获取目标父问题的直接子级 SELECT pqa.Parent_Question_ID AS Current_Question_ID, pqa.AnswerID, asq.Sub_Question_ID AS Child_Question_ID, 1 AS Hierarchy_Level -- 标记当前是第几层子级,1为直接子级 FROM ParentQuestion_Answer pqa LEFT JOIN Answer_SubQuestion asq ON pqa.AnswerID = asq.AnswerID WHERE pqa.Parent_Question_ID = @TargetParentID -- 替换成你要查询的ParentQuestionID UNION ALL -- 递归成员:迭代查询子问题的下一级子级 SELECT rqh.Child_Question_ID AS Current_Question_ID, pqa.AnswerID, asq.Sub_Question_ID AS Child_Question_ID, rqh.Hierarchy_Level + 1 AS Hierarchy_Level FROM RecursiveQuestionHierarchy rqh JOIN ParentQuestion_Answer pqa ON rqh.Child_Question_ID = pqa.Parent_Question_ID LEFT JOIN Answer_SubQuestion asq ON pqa.AnswerID = asq.AnswerID WHERE rqh.Child_Question_ID IS NOT NULL -- 只处理存在子问题的节点 ) -- 输出所有层级的子数据 SELECT * FROM RecursiveQuestionHierarchy;
代码说明:
- 锚点部分先定位到目标父问题关联的所有答案,再关联到对应的子问题,得到第一层子级数据。
- 递归部分把上一层的子问题当作新的父问题,重复执行查询逻辑,直到没有更深层级的子问题为止。
Hierarchy_Level字段可以帮你区分当前数据属于第几层,方便后续业务处理。
方案2:仅查询直接子级数据
如果只需要目标父问题的直接子问题(不需要嵌套的下一级),直接关联两张表即可,不需要递归:
SELECT pqa.Parent_Question_ID, pqa.AnswerID, asq.Sub_Question_ID FROM ParentQuestion_Answer pqa LEFT JOIN Answer_SubQuestion asq ON pqa.AnswerID = asq.AnswerID WHERE pqa.Parent_Question_ID = @TargetParentID;
额外优化建议
- 确保
AnswerID在两张表上都创建了索引,这样关联查询的性能会大幅提升。 - 如果你的数据库不支持CTE(比如MySQL 5.7及以前版本),可以用存储过程配合循环来实现递归逻辑,但CTE是最简洁易维护的方式。
内容的提问来源于stack exchange,提问作者Nats De
相关产品推荐
相关产品推荐

