介绍:
现在有两个表,一个是系统菜单dbo.App_URL,一个是用户权限表dbo.App_User,
每个用户登陆系统后菜单是从权限表里来显示.
菜单ID有三级,一级是两个数字(如01),二级四个如(0101),三级是六个数据(010101)
dbo.App_URL表: App_URL_ID, App_URL_Name, App_URL, App_Sort(排序)
dbo.App_User表: 字段 ID,User_id(用户ID), App_URL_ID(菜单ID),Manage_Or_view(管理或浏览权限, 1为管理,2为浏览)举例dbo.App_User数据:
ID       User_ID     App_URL_ID  Manage_Or_view
2000       025           03           1
2001       025           0301         1
2003       025           0302         1
2004       025           0303         1App_URL_ID, App_URL_Name, App_URL,    App_Sort
  03            行政管理       null         2
  0301          月绩考评       null         1
  030101        个人考评     Person.aspx    1
  030102        部门考评     depart.aspx    1
  0302          公告         notice.aspx    1
  0303          制度         law.aspx       1问题
在日常权限分配时,有的是有三级权限,有的是有二级, 现在出现这样的情况, 当把某个菜单的三级权限全取消了,结果在数据库里还留有该三级的上一级菜单数据(二级),这个二级关联到菜单表,如果还有这个二级菜链接字段为空,则为垃圾数据,没有任何作用.需要删除。 像上面的dbo.App_User表中第二条2001就是垃圾数据。现在要把这些垃圾数据(多用户批量)用sql语句删除掉. 请问如何实现.万分感谢!

解决方案 »

  1.   

    DELETE FROM a
    FROM App_User AS a 
    INNER JOIN App_URL AS b ON b.App_URL_ID=a.App_URL_ID
    WHERE b.App_URL IS NULL
    OR NOT EXISTS(SELECT 1 FROM App_URL AS x WHERE x.App_URL_ID LIKE b.App_URL_ID+'%' AND x.App_URL_ID!=b.App_URL_ID)
      

  2.   


    SELECT *
    FROM App_User a
    where exists(select * from APP_URL_NAME b
                 where b.APP_URL_ID like a.APP_URL_ID + '__')
          and not exists(select * from App_User c
                         where c.APP_URL_ID like a.APP_URL_ID + '__')
      

  3.   

    lz先用select 试试
    DELETE FROM a
    FROM App_User AS a 
    WHERE 
    --1、在菜单的设置表里查到该菜单具有子菜单的条件
    EXISTS(SELECT 1 FROM App_URL AS x WHERE charindex(a.App_URL_ID ,x.App_URL_ID )>0 AND x.App_URL_ID!=a.App_URL_ID )
    and
    --2、在权限设置表里查到该菜单没有配置子菜单的条件,并且用户id相同
    not EXISTS(SELECT 1 FROM App_User AS b WHERE charindex(a.App_URL_ID ,b.App_URL_ID )=0  AND a.App_URL_ID<>b.App_URL_ID and a.User_ID=b.User_ID)