2012-08-13 10 views
1

我所擁有的是一堆存儲在Oracle中的類別和子類別。關係只能用一種方式表示:每行都有一個分類標識和一個標識,如果標識有一個,那麼它就是該行父標的分類標識。如果沒有父代,則parentid爲0.即:如何構建未知級別鑽取的查詢

工具: categoryid,1; 0

材料:類別2, 0

錘子: categoryid,3; 1

指甲: categoryid,4; parentId的,2

在另一張表,我有一個項目。他們每個都有唯一的ID和相關的類別ID:

短指甲: itemid,1; 4

長指甲: itemid,2; categoryid,4

雙面: itemid,3; categoryid,3

rubber: itemid,4;類別ID,3

我建立使用ColdFusion一個 '瀏覽分類' 的Web應用程序。當他們選擇一個類別時,生成的表格應該從所選類別中提取所有項目,以及該類別子類別中的項目。也就是說,如果使用選擇的類別工具,則沒有項目的類別ID爲1,但是兩個項目具有類別3,這是工具的子類別,因此應顯示這些項目:

Clicks'Tools'鏈接>>雙面和橡皮錘顯示

我現在的問題是,沒有辦法告訴什麼類別的範圍。類別列表可能有數百行,各種分類/子類別關係種類繁多。目前,有一個6級深的子類別。

我的問題是我應該如何構建我的查詢沒有無盡'如果一個類別的父母ID爲無論然後查詢項目'?這不是唯一的方法。查詢具有所選類別ID的類別的類別,然後查詢在先前查詢中找到的那些類別的類別,然後再次用新結果重複,然後再次用新結果重複,每次按指數方式增加查詢數量I將手工編碼!

我最初的反應是這樣做的:循環一個數組,最初填充第一個'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> 

但是我發現,追加到,同時在循環數組是合法的代碼,但實際上並沒有增加循環迭代。 :/將相同的循環設置爲一個整型變量並增加它。任何想法我可以做什麼?感謝您閱讀我長的帖子笑

+0

你允許使用Oracle的'CONNECT BY'語法,它不分層查詢? – Tebbe 2012-08-13 21:01:10

+1

確保你選擇另一個索引,如果你在一個循環內循環。 「......實際上並沒有增加循環的迭代」味道很有趣。 – Henry 2012-08-13 21:48:49

+0

因此,創建一個初始值爲1-10的數組(爲什麼?)不需要循環。 然後循環陣列對每個初始元素運行查詢(不是最好的想法)。如果成功(如果recordCount?)將值添加到數組,所以現在您有一個11個元素的數組,其中第11個值爲「3」(取決於「everythingTheQueryFoundWithParentIdOfI」的選定列),因此您期望循環現在迭代11次而不是10(無論如何你會立即查看數值)?我認爲你的邏輯可能在這裏有缺陷。 – Travis 2012-08-14 10:39:55

回答

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; 
+0

你是一個美麗的人。 – 2012-08-14 14:51:01