将表格列中的所有值插入Sql

时间:2016-11-11 06:18:50

标签: sql sql-server tsql

我有两个表Roles和Menus,这两个表之间的MenuId有关系。两个表都具有相同名称的关系列" MenuId"。

菜单具有主键,而角色具有相应的外键列。

我想使用循环将Menus表中的MenuId插入Roles表,Roles表应该包含Menus表中的所有MenuId。

如下图所示。 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

3 个答案:

答案 0 :(得分:1)

要更新现有的Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") .create(); ,您可以使用稍加修改的方法:

RoleId

之后,如果要为每个RoleId插入每个MenuId:
你可以使用&#34; INSERT INTO ... SELECT ... &#34;声明为,

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

答案 1 :(得分:1)

创建一个包含所需列的第3个表,并在该表上执行以下查询

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

答案 2 :(得分: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