2011-08-01 154 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