我有以下3张表:
CREATE TABLE Tests (
    Test_ID INT,
    TestName VARCHAR(50));
INSERT INTO Tests VALUES (1, 'SQL Test');
INSERT INTO Tests VALUES (2, 'C# Test');
INSERT INTO Tests VALUES (3, 'Java Test');
CREATE TABLE Users (
    [User_ID] INT,
    UserName VARCHAR(50));
INSERT INTO Users VALUES (1, 'Joe');
INSERT INTO Users VALUES (2, 'Jack');
INSERT INTO Users VALUES (3, 'Jane');
CREATE TABLE UserTests (
    ID INT,
    [User_ID] INT,
    Test_ID INT,
    Completed INT);
INSERT INTO UserTests VALUES (1, 1, 1, 0);
INSERT INTO UserTests VALUES (2, 1, 2, 1);
INSERT INTO UserTests VALUES (3, 1, 3, 1);
INSERT INTO UserTests VALUES (4, 2, 1, 0);
INSERT INTO UserTests VALUES (5, 2, 2, 0);
INSERT INTO UserTests VALUES (6, 2, 3, 0);
INSERT INTO UserTests VALUES (7, 3, 1, 1);
INSERT INTO UserTests VALUES (8, 3, 2, 1);
INSERT INTO UserTests VALUES (9, 3, 3, 1);我想创建一些规则/触发器,以便当一个新用户被添加到user表时,每个Test的一个条目以及该用户的Id将被添加到UserTests表中。
如果新用户ID为5,则如下所示:
INSERT dbo.UserTest
       (USER_ID, TEST_ID, Completed)
VALUES 
       (5, SELECT TEST_ID FROM Tests, 0)当然,这种语法是错误的,但是给出一个我期望发生的事情的想法。
因此,我期望该语句将这些值添加到UserTests表中:
User ID| Test ID| Completed 
5      | 1      | 0
5      | 2      | 0
5      | 3      | 0发布于 2014-07-21 10:38:24
您可以在user表中使用after触发器。
Create Trigger tr_user on Users 
After Insert 
AS Begin
   INSERT UserTest(USER_ID, TEST_ID, Completed)
   Select I.USER_ID, t.TEST_ID, 0
   From Inserted I, Tests t
END发布于 2014-07-21 11:11:10
这里有一个SQL,它查找丢失的记录并插入它们。
SQL Fiddle
The SELECT
select u.user_id, t.test_id, 0 as Completed
from users u 
cross join tests t
where not exists (
        select 1 
        from usertests ut 
        where ut.user_id = u.user_id and ut.test_id = t.test_id)在select之前添加insert into UserTests (User_Id, Test_Id, Completed)将插入这些记录。
如果需要,可以将用户id添加到where子句中,以便对单个用户执行此操作。它是可重新运行的,所以它不会为一个已经拥有测试ids的用户重新插入测试ids,但是如果引入了新的测试,它将添加新的ids。
https://stackoverflow.com/questions/24863069
复制相似问题