层级查询中关联Category与Article表查询服饰类文章的问题
解决Oracle层次查询关联文章表返回0条记录的问题
兄弟,你这问题我一眼就看出症结了——你把JOIN和层次查询的顺序搞反啦!咱们先拆解下原查询的问题:
你原来的语句是先把Category和Article做JOIN,再执行层次遍历。这就导致只有那些已经关联了文章的分类才会被纳入层次查询的范围。如果Clothes本身没有直接对应的文章,或者它的子分类里暂时没有关联文章的,整个查询就会返回空结果。
正确的解决思路
我们应该先通过层次查询拿到所有属于Clothes及其子分类的完整分类列表,再用这个列表去关联Article表,这样就能确保所有相关分类都被覆盖到,不管有没有对应的文章。
方案1:查询有对应文章的分类及文章信息
如果只需要显示有文章的分类和对应的文章,可以用CTE先获取所有目标分类,再关联文章:
WITH AllClothesCategories AS ( -- 先拿到Clothes及其所有子分类的完整列表 SELECT curCategory, level, parentCategory FROM Category START WITH curCategory = 'Clothes' CONNECT BY PRIOR curCategory = parentCategory ) -- 再关联文章表,筛选出对应分类的文章 SELECT acc.level, acc.curCategory, acc.parentCategory, a.name AS article_name FROM AllClothesCategories acc JOIN Article a ON acc.curCategory = a.artCategory ORDER BY acc.level, acc.curCategory;
方案2:显示所有分类(含无文章的分类)
如果想保留所有Clothes的子分类,哪怕某个分类下没有文章也显示出来,可以用LEFT JOIN:
WITH AllClothesCategories AS ( SELECT curCategory, level, parentCategory FROM Category START WITH curCategory = 'Clothes' CONNECT BY PRIOR curCategory = parentCategory ORDER SIBLINGS BY curCategory ) SELECT acc.level, acc.curCategory, acc.parentCategory, a.name AS article_name -- 无文章时这里会显示NULL FROM AllClothesCategories acc LEFT JOIN Article a ON acc.curCategory = a.artCategory;
为什么原查询不行?
再给你捋一遍原查询的执行顺序:
- 先执行
Category JOIN Article ON artCategory = curCategory,这一步会过滤掉所有没有对应文章的分类。 - 再对过滤后的结果做层次查询,从
curCategory = 'Clothes'开始遍历。
如果Clothes本身没有关联文章,第一步就把它过滤掉了,自然返回0条记录。
内容的提问来源于stack exchange,提问作者Lebron11
相关产品推荐
相关产品推荐

