一个类似权限挂载的设计

四个表,

第一个 DECLARE @A TABLE 状态表

DECLARE @A TABLE
    (
      [Aid] INT PRIMARY KEY NOT NULL ,
      [name] NVARCHAR(50) NOT NULL
    ) ;

有id,有[name]表状态,假设@A表有三种状态

INSERT  INTO @A( Aid, name )
VALUES  ( 1, N'状态1')
INSERT  INTO @A( Aid, name )
VALUES  ( 2, N'状态2')
INSERT  INTO @A( Aid, name )
VALUES  ( 3, N'状态3')

第二个 DECLARE @B TABLE 动作表

DECLARE @B TABLE
    (
      [Bid] INT PRIMARY KEY NOT NULL ,
      [Aid] INT NOT NULL ,
      [Name] NVARCHAR(50) NOT NULL
    );

有自己的Id,和表@A的Id,[name]表动作名称 假设@A表 状态1对应2个动作、状态2下对应3个动作、状态3下对应1个动作

INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 1, -- id - int name就可以说是状态1下的动作1
          1,  -- Aid - int
          N'状态1下的动作1' )
INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 2, -- id - int  name就可以说是状态1下的动作2
          1,  -- Aid - int
          N'状态1下的动作2' )
INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 3, -- id - int name就可以说是状态2下的动作1
          2,  -- Aid - int
          N'状态2下的动作1' )

INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 4, -- id - int  name就可以说是状态2下的动作2
          2,  -- Aid - int
          N'状态2下的动作2' ) 
INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 5, -- id - int name就可以说是状态2下的动作3
          2,  -- Aid - int
          N'状态2下的动作3' )     
INSERT  INTO @B( Bid, Aid, Name )
VALUES  ( 6, -- id - int name就可以说是状态3下的动作1
          3,  -- Aid - int
          N'状态3下的动作1' )  

第三个 DECLARE @C TABLE 部门表

DECLARE @C TABLE
    (
      [Cid] INT PRIMARY KEY NOT NULL ,
      [Aid] INT NOT NULL ,
      [Deptid] INT NOT NULL
    );

有自己的Id,和表@A的Id,[Deptid]表部门Id,这里假设有2个部门

INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 1, -- id - int
          1, -- Aid - int  状态1
          1  -- Deptid - int
          )     
INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 2, -- id - int
          2, -- Aid - int  状态2      
          1  -- Deptid - int
          )
INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 3, -- id - int
          3, -- Aid - int   状态3
          1  -- Deptid - int
          )
------50321
INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 4, -- id - int
          1, -- Aid - int   状态1
          50321  -- Deptid - int
          )     
INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 5, -- id - int
          2, -- Aid - int   状态2
          50321  -- Deptid - int
          )
INSERT  INTO @C( Cid, Aid, Deptid )
VALUES  ( 6, -- id - int
          3, -- Aid - int   状态3
          50321  -- Deptid - int
          )

第四个 DECLARE @D TABLE 部门表动作表

DECLARE @D TABLE
    (
      [Did] INT PRIMARY KEY IDENTITY(1, 1)NOT NULL ,
      [Bid] INT NOT NULL ,
      [Cid] INT NOT NULL
    );

有自己的Id,和表@B的Id,表@C的Id

INSERT  INTO @D( Bid, Cid )
VALUES  ( 1, -- Bid - int    状态1下的动作1
          1  -- Cid - int     部门1  和状态1
          ) 

INSERT  INTO @D( Bid, Cid )
VALUES  ( 2, -- Bid - int     状态1下的动作2
          1  -- Cid - int      部门1  和状态1
          ) 

INSERT  INTO @D( Bid, Cid )
VALUES  ( 4, -- Bid - int      状态2下的动作2
          2  -- Cid - int      部门1  和状态2
          ) 

INSERT  INTO @D( Bid, Cid )
VALUES  ( 5, -- Bid - int       状态2下的动作3
          1  -- Cid - int        部门1  和状态2
          ) 

 

:总共有6个动作,已知为部门1配置的动作有4个,现在需要你copy一份部门1的动作个另一个部门50321

/*
A表就是状态列表 
B表就是每个状态下对应的动作列表
C就是每个状态拥有那些部门     或者说部门下拥有那些状态
D就是部门下拥有的状态的动作
*/
--现在要往  D表复制一份 部门1的数据
/*

 

根据表@C,@A我们可知道  ,150321 部门已配置的状态,可配置的动作

/*已配置的状态,可配置的动作*/
SELECT  b.Bid ,
        c.Cid ,
        A.name AS '状态' ,
        B.NAME AS '动作'
FROM    @C AS c
        LEFT JOIN @A AS a ON C.Aid = a.Aid
        LEFT JOIN @B AS b ON a.Aid = b.Aid
WHERE   c.Deptid = 1

SELECT  b.Bid ,
        c.Cid ,
        A.name AS '状态' ,
        B.NAME AS '动作'
FROM    @C AS c
        LEFT JOIN @A AS a ON C.Aid = a.Aid
        LEFT JOIN @B AS b ON a.Aid = b.Aid
WHERE   c.Deptid = 50321

 

根据表@D、@C、@B 可得知 @C表1部门已配置的四个动作

/*1部门已配置的4个动作*/
SELECT  b.bid ,c.cid ,b.Name
FROM    @D AS d
        LEFT JOIN @C AS c ON d.Cid = c.Cid
        LEFT JOIN @B AS b ON d.Bid = b.Bid
WHERE   c.Deptid = 1

然后就是根据50321部门可以配置的动作与1部门相链接,得出可被50321部门配置的并且1部门已配置的动作的集合,将其插入 @D 表 ,

INSERT  INTO @D( Bid ,Cid )
        SELECT  v1.Tbid ,v1.Tcid
        FROM    ( SELECT    b.bid AS Tbid ,c.cid AS Tcid
                  FROM      @B AS b
                            LEFT JOIN @A AS a ON a.aid = b.Aid
                            LEFT JOIN @C AS c ON a.aid = c.Aid
                  WHERE     c.Deptid = 50321
                ) v1
                INNER JOIN ( SELECT b.bid AS bid ,c.cid AS cid
                             FROM   @B AS b
                                    LEFT JOIN @A AS a ON a.aid = b.Aid
                                    LEFT JOIN @C AS c ON a.aid = c.Aid
                                    RIGHT JOIN @D AS d ON b.bid = d.bid
                             WHERE  c.Deptid = 1
                           ) V2 ON v1.Tbid = V2.bid

然后查询出,50321部门的动作配置

SELECT  b.bid ,c.cid ,b.Name
FROM    @D AS d
        LEFT JOIN @C AS c ON d.Cid = c.Cid
        LEFT JOIN @B AS b ON d.Bid = b.Bid
WHERE   c.Deptid = 50321

 

 

 

posted on 2014-02-27 17:27  Aidou_dream  阅读(260)  评论(0编辑  收藏  举报

导航