menu是一个菜单表,user_menu是一个用户分配到的菜单。
menu表里记录了每个菜单和他的父级菜单。
现在我想用一个SQL语句,在USER_MENU表中找出,哪个用户分配了一个没有子级菜单的菜单。并把这条记录删除。
create table menu(
menu_id varchar2(4000),
parent_menu_id varchar2(4000),
menu_name varchar2(4000)
); create table user_menu(
user_id varchar2(4000),
menu_id varchar2(4000)
);MENU_ID PARENT_MENU_ID MENU_NAME
M1001001 M1001 财务表数据查询
M1001002 M1001 员工表数据查询
M1001 查询菜单
M1001001001 M1001001 员工日用品领用查询USER_ID MENU_ID
USER_1 M1001001
USER_1 M1001001001
USER_2 M1001001
如上图:
我需要找到哪个用户分配的菜单,没有下级菜单的。
这里,只有USER_2分配了这样的菜单。所以要找到的结果应该是(USER_ID,MENU_ID)=(USER_2,M1001001)
----------------------------------
我自己用了一个比较傻的办法,但觉得效率比较低。请SQL高手帮我看看,有没有比较好的SQL语句,可以达到这个目的。谢谢。我认为,有父亲节点的或有儿子节点的,肯定是不需要删除的。除此以外的应该就是要删除的菜单。
select * from user_menu m where (m.user_id,m.menu_id) not in
(
-- 有孩子节点的父亲节点
select tt.user_id,tt.menu_id
from user_menu tt inner join
user_menu rt1 on rt1.user_id = tt.user_id
inner join menu rt2 on rt1.menu_id=rt2.menu_id
where tt.menu_id=rt2.parent_menu_id
)
and (m.user_id,m.menu_id) not in (
-- 有父节点的孩子节点
select tt.user_id,tt.menu_id
from user_menu tt inner join menu rt1 on tt.menu_id=rt1.menu_id
inner join user_menu rt2 on rt1.parent_menu_id = rt2.menu_id
)
SQL
menu表里记录了每个菜单和他的父级菜单。
现在我想用一个SQL语句,在USER_MENU表中找出,哪个用户分配了一个没有子级菜单的菜单。并把这条记录删除。
create table menu(
menu_id varchar2(4000),
parent_menu_id varchar2(4000),
menu_name varchar2(4000)
); create table user_menu(
user_id varchar2(4000),
menu_id varchar2(4000)
);MENU_ID PARENT_MENU_ID MENU_NAME
M1001001 M1001 财务表数据查询
M1001002 M1001 员工表数据查询
M1001 查询菜单
M1001001001 M1001001 员工日用品领用查询USER_ID MENU_ID
USER_1 M1001001
USER_1 M1001001001
USER_2 M1001001
如上图:
我需要找到哪个用户分配的菜单,没有下级菜单的。
这里,只有USER_2分配了这样的菜单。所以要找到的结果应该是(USER_ID,MENU_ID)=(USER_2,M1001001)
----------------------------------
我自己用了一个比较傻的办法,但觉得效率比较低。请SQL高手帮我看看,有没有比较好的SQL语句,可以达到这个目的。谢谢。我认为,有父亲节点的或有儿子节点的,肯定是不需要删除的。除此以外的应该就是要删除的菜单。
select * from user_menu m where (m.user_id,m.menu_id) not in
(
-- 有孩子节点的父亲节点
select tt.user_id,tt.menu_id
from user_menu tt inner join
user_menu rt1 on rt1.user_id = tt.user_id
inner join menu rt2 on rt1.menu_id=rt2.menu_id
where tt.menu_id=rt2.parent_menu_id
)
and (m.user_id,m.menu_id) not in (
-- 有父节点的孩子节点
select tt.user_id,tt.menu_id
from user_menu tt inner join menu rt1 on tt.menu_id=rt1.menu_id
inner join user_menu rt2 on rt1.parent_menu_id = rt2.menu_id
)
SQL
解决方案 »
- oracle 数据库Id自增问题,
- Oracle 10g的第一次用户登录问题
- 怎么将ORACLE数据库对象导入到DB2中去
- 现有一个字段数据为1到N不等,是主键数据,还有个空的字符字段 我想修改空字符字段里的数据要求格式如下V0000001后面的那个1就是主键修改数据必须保持在8位
- 使用PRO*C如何进行数据库重连
- 如何设置oracle时间戳类型的时区
- oracle在线等待,大量insert之后commit失败了,导致现在启动不了
- 这个查询为什么会有值?
- 简单问题:取第20到40条记录,这样的SQL语句如何写。kkkkkkkk快速给分
- 这个视图该怎么建
- Oracle物化视图,表空间!!!!
- REGEXP_SUBSTR() 用法请教
我需要找到哪个用户分配的菜单,没有下级菜单的。
USER_1 M1001001001 这条记录也没有下级菜单,算不算呢
那么,下述记录中,USER_1分配的菜单M1001001>M1001001001他们是有父子关系的父子菜单。所以虽然M1001001001没有下级菜单,也不能删除。
USER_1 M1001001
USER_1 M1001001001
(select 1 from user_menu t where t.user_id=m.user_id and t.menu_id in (select parent_menu_id from menu));