You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

层级查询中关联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;

为什么原查询不行?

再给你捋一遍原查询的执行顺序:

  1. 先执行Category JOIN Article ON artCategory = curCategory,这一步会过滤掉所有没有对应文章的分类。
  2. 再对过滤后的结果做层次查询,从curCategory = 'Clothes'开始遍历。
    如果Clothes本身没有关联文章,第一步就把它过滤掉了,自然返回0条记录。

内容的提问来源于stack exchange,提问作者Lebron11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:26:34