2011-08-01 196 views
1

我有一個菜單表,我很努力地選擇沒有孩子的所有父母菜單。查詢沒有孩子的父母

SELECT 
CASE 
WHEN (SELECT COUNT(1) children 
     FROM menu 
     WHERE cod_idiom = 'EN' 
     START WITH cod_menu_parent = m1.cod_menu 
     CONNECT BY PRIOR cod_menu = cod_menu_parent) = 0 THEN 
     cod_menu 
END x 
FROM menu m1 
WHERE m1.isSubMenu = 'T' 

* isSubMenu ='T'表示它可能(應該)有孩子,可能是子菜單或文件。

這個想法是首先查詢所有的子菜單,得到他們的菜單代碼,然後做一個CONNECT BY PRIOR來計數它的孩子。

上述查詢沒有預期的效果,你們有什麼想法嗎?

+1

從技術上講,'isSubMenu'是一個派生字段,它通常在更規範化的數據庫中不被贊同;你可能希望刪除它,或者被迫保持同步(不是一個漂亮的任務)。此外,字段名稱聽起來像是屬於關係的另一邊(即它是一個子字段,而不是它們)。如果您對該字段的使用描述是正確的,請考慮將名稱更改爲'hasSubMenu' –

回答

1
SELECT m1.cod_menu 
    FROM menu m1 
    WHERE NOT EXISTS(SELECT NULL 
         FROM MENU m2 
         WHERE m1.cod_menu = m2.cod_menu_parent) 
     AND m1.isSubMenu = 'T' 
+0

謝謝您的回答。我感到遲鈍*嘆氣 – Melladric