2017-04-04 131 views
0

我想填补结表这两个表:灌装结合表与模拟数据

Create table [dbo].[Event] 
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    [naam] varchar(30) NOT NULL, 
    [periode] date NOT NULL, 
    [maxbezoeker] int NOT NULL, 
    [locatie] varchar(50) NOT NULL 
) 

Create table [dbo].[Medewerker] 
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    [wachtwoord] varchar(100) NOT NULL, 
    [rechten] varchar(100) NOT NULL, 
    [gebruikersnaam] varchar(30) UNIQUE NOT NULL 
) 

结表:

Create table [dbo].[Event_Medewerker] 
(
    [event_id] int FOREIGN KEY REFERENCES [dbo].[Event](id) NOT NULL, 
    [medewerker_id] int FOREIGN KEY REFERENCES [dbo].[Medewerker](id) NOT NULL 
) 

事件表和Medewerker表目前有1000个模拟输入在他们中。我想链接他们之间的数据,但我想不出我会怎么做,而不是通过产生1000个随机数。但是,如果我这样做,我觉得我会结束一大堆未链接的条目。有没有更好的方式来填充模拟数据的联结表?

“Medewerker”是一名员工,在这种情况下,“活动”将成为音乐节。我希望每一个事件都与Medewerkers相关联。

我正在使用SQL Server 2014 Management Studio和mockaroo.com生成数据。

+0

你想如何链接数据?每个事件都应该有一个medeworker?或许多不同的组合? – BeanFrog

+0

许多不同的组合。对不起,如果你有顺序标识符,我会在文章 – FastCow

+1

中添加更多解释,如果只是将它们加入到每个表的标识符值中以便将记录插入到链接表中,是否会有问题? – Tanner

回答

2

因此,您可以根据每个表中的顺序ID值简单地加入您的2个表格,因为这是模拟数据。然后,您可以使用连接的结果插入链接表。下面是您可以在隔离测试运行一个简单的例子:

CREATE TABLE #event (id INT); 

CREATE TABLE #medwerker (id INT); 

CREATE TABLE #event_medwerker 
    (
     event_id INT , 
     medwerker_id INT 
    ); 

INSERT INTO #event 
     (id) 
VALUES (1), (2), (3); 

SELECT * FROM #event; 

INSERT INTO #medwerker 
     (id) 
VALUES (1), (2), (3); 

SELECT * FROM #medwerker; 

INSERT INTO #event_medwerker 
     (event_id , 
      medwerker_id 
     ) 
     SELECT e.id , 
       m.id 
     FROM #event e 
       INNER JOIN #medwerker m ON m.id = e.id; 

SELECT * FROM #event_medwerker; 

DROP TABLE #event_medwerker; 
DROP TABLE #event; 
DROP TABLE #medwerker; 
0

A“Medewerker”是员工,在这种情况下,“事件”将是一个音乐节。我希望每一个事件都与Medewerkers相关联。

在这种情况下,你可以使用此查询

DECLARE @Event AS TABLE(id int) 

DECLARE @Medewerker AS TABLE(id int) 

DECLARE @Event_Medewerker AS TABLE (EventId int, MedewerkerId int) 

INSERT INTO @Event 
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9),(10) 

INSERT INTO @Medewerker 
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9),(10) 

INSERT INTO @Event_Medewerker (EventId, MedewerkerId) 
SELECT e.id AS EventID, md.id AS MedewerkerId 
FROM 

(SELECT * FROM @Event t) e 

CROSS APPLY 

(
SELECT TOP (ABS(Checksum(NewID()) % 10) + 2) * FROM @Medewerker t ORDER BY newid() -- random 2 - 12 item bat ki o bang @Medewerker 
) md 

ORDER BY e.id, md.id 

SELECT * FROM @Event_Medewerker em 
0

我会用一个临时表,以填补所有可能的组合,包括随机订购号。然后迭代所有事件,每次确定一个随机数并使用随机排序数从临时表中插入以确定随机数。

事情是这样的:

BEGIN 
    -- temp table 
    DECLARE @dummy_table table(Event_id int, Medewerker_id int, Order_nr int) 

    -- insert all possible combinations with a random order nr 
    insert into @dummy_table(Event_id, Medewerker_id, Order_nr) 
    select 
     ROW_NUMBER() OVER(PARTITION BY e.id ORDER BY newid() ASC), -- use newid() to randomize order 
     e.id, 
     m.id 
    from 
     Event e 
     join Medewerker m -- cross join 

    -- cursor for all events 
    DECLARE cur_evts CURSOR FOR SELECT Id FROM Event; 
    DECLARE @Event_id int 
    DECLARE @random_amount int 

    OPEN cur_evts; 
    FETCH NEXT FROM cur_evts INTO @Event_id; 

    -- iterate all events 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- random amount between 50..500 
     SET @random_amount = 50 + (450 * RAND(convert(varbinary, newid()))) 

     insert into Event_Medewerker(event_id, medewerker_id) 
     select 
      event_id, 
      medewerker_id 
     from 
      @dummy_table 
     where 
      Event_id = @Event_id 
      and order_nr < @random_amount 

     FETCH NEXT FROM cur_evts INTO @Event_id; 
    END 
    CLOSE cur_evts; 
    DEALLOCATE cur_evts; 
END 
0

数据


IF OBJECT_ID('dbo.Event') IS NOT NULL 
Drop table [Event] 
Create table [dbo].[Event] 
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    [naam] varchar(30) NOT NULL, 
    [periode] date NOT NULL, 
    [maxbezoeker] int NOT NULL, 
    [locatie] varchar(50) NOT NULL 
) 

IF OBJECT_ID('dbo.Medewerker') IS NOT NULL 
Drop table [Medewerker] 
Create table [dbo].[Medewerker] 
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL, 
    [wachtwoord] varchar(100) NOT NULL, 
    [rechten] varchar(100) NOT NULL, 
    [gebruikersnaam] varchar(30) UNIQUE NOT NULL 
) 


IF OBJECT_ID('dbo.Event_Medewerker') IS NOT NULL 
    Drop table [Event_Medewerker] 
Create table [dbo].[Event_Medewerker] 
(
    [event_id] int FOREIGN KEY REFERENCES [dbo].[Event](id) NOT NULL, 
    [medewerker_id] int FOREIGN KEY REFERENCES [dbo].[Medewerker](id) NOT NULL 
) 

INSERT INTO [Event] 
(
naam 
,periode 
,maxbezoeker 
,locatie 
) 
SELECT 'Harry','2017-04-04',77,'dsghvgj'Union All 
SELECT 'Harry','2017-04-04',77,'dsghvgj'Union All 
SELECT 'Harry','2017-04-04',77,'dsghvgj'Union All 
SELECT 'Harry','2017-04-04',77,'dsghvgj' 

INSERT INTO [Medewerker] 
(
wachtwoord 
,rechten 
,gebruikersnaam 
) 

SELECT 'Gills','three month','ggg' Union All 
SELECT 'Gills','three month','ANbc' Union All 
SELECT 'Gills','three month','ANbaac' Union All 
SELECT 'Gills','three month','ooooANbc' 


SELECT * FROM [Event] 
SELECT * FROM [Medewerker] 
SELECT * FROM [Event_Medewerker] 

将数据插入到表桥代码示例模式


DECLARE @Event INT 
    ,@Medewerker INT 
    ,@RecordCount INT 
    ,@minid INT = 1 
    ,@maxid INT 

SELECT @RecordCount = COUNT(1) FROM [Event] inner join [Medewerker] on [Event].id=[Medewerker].id 

SET @maxid = @RecordCount 

    WHILE (@minid <= @maxid) 
    BEGIN 
     SELECT @Event = id FROM [Event] 
     WHERE NOT EXISTS (
       SELECT 1 
       FROM [Event_Medewerker] Em 
       WHERE em.event_id = [Event].id 
       ) 
      AND id = @minid 

     SELECT @Medewerker = id FROM [Medewerker] 
     WHERE NOT EXISTS (
       SELECT 1 
       FROM [Event_Medewerker] Em 
       WHERE em.event_id = [Medewerker].id 
       ) 
      AND id = @minid 

     INSERT INTO [Event_Medewerker] 
     (
      event_id 
      ,medewerker_id 
      ) 
     SELECT @Event,@Medewerker 

     SET @minid = @minid + 1 
    END