2016-11-11 112 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 
相關問題