如何构造查询未知级别的下钻

时间:2012-08-13 20:34:41

标签: oracle coldfusion

我所拥有的是Oracle中存储的一堆类别和子类别。该关系仅以一种方式表示:每行都有一个categoryid和一个parentid,如果有一行,则该行是父行的父类别。如果没有父母,则parentid为0.即:

工具: categoryid,1; parentid,0

材料: categoryid,2; parentid,0

锤子: categoryid,3; parentid,1

指甲: categoryid,4; parentid,2

在另一张表中,我有物品。它们每个都有唯一的ID和相关的categoryid:

短指甲: itemid,1; categoryid,4

长指甲: itemid,2; categoryid,4

双面: itemid,3; categoryid,3

橡胶: itemid,4; categoryid,3

我正在使用coldfusion构建一个“浏览类别”网络应用。当他们选择一个类别时,结果表应该从所选类别中提取所有项目,以及该类别子类别中的项目。也就是说,如果使用选定的类别工具,则没有项目的categoryid为1,但是两个项目的categoryid为3,这是工具的子类别,因此应显示这些项目:

点击“工具”链接>>显示双面和橡皮锤

我现在面临的问题是,无法确定类别的范围。类别列表可能是数百行,具有各种各样的类别/子类别关系。目前,有一个6级深度的子​​类别。

我的问题是我应该如何构建我的查询而没有无限的'如果父类ID为 的类别然后查询项目'?这不是唯一的方法。查询具有所选categoryid的parentid的类别,然后查询具有上一个查询中找到的那些类别的parentid的类别,然后再次使用新结果重复,然后再次使用新结果重复,每次以指数方式添加查询数量I会手工编码!!

我最初的反应是这样做:循环一个最初填充了第一个'parentid查询'的数组。循环时,查询每个数组项的parentid。如果找到任何内容,请将其添加到当前循环数组中。像这样:

<!--- populate Inital 'parentid query' array --->
<cfset newArray = ArrayNew(1)>
<cfloop from="1" to="10" index="i">
    <cfset #ArrayAppend(newArray,i)#>
</cfloop>

<!--- if parentid is found for index, add to newArray --->
<cfloop array="#newArray#" index="i">
    <query for parentid with 'i'>
    <if successful>
        ArrayAppend(newArray,everythingTheQueryFoundWithParentIdOfI)
    </if>
</cfloop>

但我发现在循环中追加数组是有效的代码,但实际上并没有增加循环的迭代。 :/相同用于将循环设置为整数变量并相反增加。任何想法我能做什么?感谢您阅读我的长篇帖子lol

1 个答案:

答案 0 :(得分:0)

您的查询可以使用connect_by语法:

SELECT cat.cat_desc, items.item_desc
  FROM cat JOIN items ON cat.category_id = items.category_id
 START WITH cat.category_id = 1  -- ID of the starting category
 CONNECT BY PRIOR cat.category_id = cat.parent_category_id;
相关问题