四个表,
第一个 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我们可知道 ,1、50321 部门已配置的状态,可配置的动作
/*已配置的状态,可配置的动作*/ 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