2016-11-11 73 views
0

我有两个表角色和菜单,并且在这两个表之间的MenuId上存在关系。两个表的关系列都有相同的名称“MenuId”。将表中列的所有值插入Sql中的另一个表的列中

菜单相应地具有主键和角色具有外键列。

我想使用一个循环从菜单表中插入菜单ID与角色表,角色表应该都从菜单表中的菜单ID(一个或多个)。

类似于下图所示。 RoleID 1然后全部MenuID,然后RoleId 2,再次全部MenuID。

但我不想插入使用触发器。

我已经试过类似: -

DECLARE @counter int 
SET @counter = 0 
WHILE @counter < 65 BEGIN 
UPDATE Roles SET MenuId = @counter + 1 
SET @counter = @counter + 1 
END 

enter image description here

+0

您试图在查询中.update价值观,你的问题是*插入值* ...它必须是表**中的**更新值...对吗? – Vikrant

+0

我输入了一些记录,所以想要更新他们1然后要插入新的记录,抱歉的困惑.. –

+0

与我的查询的问题是,它的硬代码(高达65),但我只想从列(域)。 –

回答

1

要更新现有RoleId S,你可以用你的方法稍作修改:

DECLARE @counter int =0 
DECLARE @records int 

SELECT @records = COUNT(MenuId) FROM Menus 

WHILE @counter < @records 
BEGIN 

    UPDATE Roles SET MenuId = @counter + 1 
    WHERE RoleId = 1 
    SET @counter = @counter + 1 
END 

之后,如果你想按照每个RoleId插入每个MenuId:
您可以使用“INSERT INTO ... SELECT ...“语句,

DECLARE @roles int = 0 

WHILE @roles < 10 --assuming that you have **10 roles** to insert 
BEGIN 
    INSERT INTO Roles(MenuId, RoleId) 
    SELECT MenuId, @roles --it's a roleId you want to insert 
    FROM Menus m 

    SET @roles = @roles + 1 
END 

上面的语句将插入所有菜单ID对每个角色ID

+0

更新查询更新所有记录中的相同值..我有像1,2,3,8,9,10这样的随机值,所以它应该只有这些值.. –

+0

更新仍然有同样的问题@Vikrant和我认为它不应该是更新命令的where子句中的硬代码值。 –

+0

我们不应该使用行号来更新值 –

1

创建所需的列第三位表,并执行下面的查询该表

insert into table3 (select table1.r_id,table2.menu_id from table1 cross join table2); 
+0

**想要从菜单表插入MenuId到​​角色表使用循环**,不需要第三个表 – Vikrant

0

在房间里的大象用SQL工作时做的事情在一个循环 - 性能一般是可怕的,你几乎从来没有需要。

在你的数据库结构尚不完全清楚,但这个应该指向你在正确的方向:

create table Menu 
(
    MenuId int 
); 

create table Role 
(
    RoleId int 
); 

create table RoleMenu 
(
    RoleId int, 
    MenuId int 
); 

insert into Menu(MenuId) values(1),(2),(3); 
insert into Role(RoleId) values(1),(2),(3),(4); 

-- some data already in table 
insert into RoleMenu(RoleId, MenuId) values(1,1), (1,2); 

with cte as (
    select distinct RoleId, MenuId 
    from Menu 
    cross join Role 
) 
insert into RoleMenu(RoleId, MenuId) 
select cte.RoleId, cte.MenuId 
from cte 
left outer join RoleMenu rm on cte.MenuId = rm.MenuId and cte.RoleId = rm.RoleId 
where rm.RoleId is null -- don't insert where we already have data 

select * from RoleMenu order by RoleId, MenuId 
相关问题