2012-08-24 46 views
0

我使用其他開發人員編寫以下查詢:修改Oracle查詢開始

SELECT DISTINCT c.id category_id, 
    c.parent_id, 
    d.name AS category_name, 
    level 
FROM category c, 
    category_language d 
WHERE c.id         = d.category_id 
AND c.is_active       = 1 
AND c.is_deleted       = 0 
AND c.deleted_date      IS NULL 
AND d.is_active       = 1 
AND d.is_deleted       = 0 
AND d.deleted_date      IS NULL 
AND ((to_date(d.expiry_date,'DD-MON-YYYY') > to_date(sysdate,'DD-MON-YYYY')) 
OR d.expiry_date       IS NULL) 
AND d.language_id       = 1 
AND c.cat_type_id       = 1 
    START WITH c.parent_id     =1308206844 
    CONNECT BY c.parent_id     = prior c.id 
ORDER SIBLINGS BY d.name 

我有兩個問題。

首先,我不知道該怎麼 START,CONNECT BYPRIOR關鍵詞在查詢工作。

其次,當我改變ORDER SIBLINGS BY d.nameORDER SIBLINGS BY c.priority遞減拋出以下錯誤消息:=

ORA-01791: not a SELECTed expression 
01791. 00000 - "not a SELECTed expression" 

我也試圖改變的數據類型從數字到字符串的優先級,但引發相同的錯誤。

我想通過c.priority desc運行查詢來生成所需的結果。

+0

@hol:你說對這些oracle關鍵字的學習是正確的。順便說一下,問題的解決方案是,我忘記在select語句中選擇c.priority,當我通過c.priority desc.Now寫入命令時它的工作正常... :) –

+0

很酷。這是因爲結果集是有序的,所以你必須包含它。我的答案很高興爲你工作。 – hol

回答

3

關鍵字START WITH, CONNECT BY, PRIOR用於顯示層次結構。在我看來,這個鏈接是一個非常好的教程:http://www.adp-gmbh.ch/ora/sql/connect_by.html

至少我學會了如何使用它的例子。也許這也給了你答案ORDER SIBLINGS BY的真正含義,然後你可以自己回答如何避免錯誤信息。顯然,Oracle希望您將列添加到選定的列中。 ORDER SIBLINGS是特定於層次結構,你可以谷歌它。但我認爲你首先需要了解的START WITH, CONNECT BY, PRIOR

也許你不想做ORDER SIBLINGS BY但只有ORDER BY

+0

我認爲這是對這個問題的正確答案。 –