2009-03-05 45 views
24

好吧我有一个表有两列,userID和courseID。它用于将培训课程分配给用户。它看起来像这样:在SQL中复制一行?

userid courseid 
0   1 
0   3 
0   6 
1   1 
1   4 
1   5 

所以用户0被分配到课程1,3,6和用户1被分配到1 4 5

反正我需要分配给6每一个用户并创建一个具有该userid和courseid 11的新行,基本上将当前分配给6的每个用户也分配给11

由于某种原因(我没有创建此数据库)两行都标记为主钥匙,以及我尝试过的一些陈述因此而引发了一个错误,这笔交易到底是什么?

哦,也许这是因为有一些用户已经分配到11,所以它可能会窒息?

请帮助

回答

44
Insert Into TableName (userID, courseID) 
    Select userID, 11 From TableName Where courseID=6; 

而且,我有点受您的评论混淆两者都是主键。这两行可以是主键的部分,或者两者都可以是唯一键,但它们不能都是主键。就错误而言,这可能是因为查询试图插入与现有行重复的行。为了消除这种可能性,你可以这样做:

Insert Into TableName (userID, courseID) 
    Select userID, 11 From TableName Where courseID=6 
    AND (userID not in (Select userID From TableName Where courseID=11)) 

根据您的数据库上,这可能工作太:

INSERT OR IGNORE INTO TableName (userID, courseID) 
    SELECT userID, 11 FROM TableName WHERE courseID=6; 

无论如何,你去那里。

+1

GS - 这是一个有趣的结构 - 其中它工作吗?它在SQL Server 2005中不起作用... – 2009-03-05 15:27:26

-2

这应有助于:

INSERT 
INTO [table] 
     (
       userid, 
       courseid 
     ) 
SELECT userid, 
     11 
FROM [table] 
WHERE courseid = 6 
    AND userid NOT IN 
        (SELECT userid 
        FROM [table] 
        WHERE courseid = 11 
        ); 

这将在6当然不是在过程11选择所有用户,并与课程11将它们添加到表中。

+0

嗯......这不起作用。根据定义,具有6的courseID的记录不会具有11的courseID。您需要一个子查询,如我在答案中所示。 – 2009-03-05 15:06:36

2
insert into TableName (userId, courseId) 
    select userId, 11 
    from TableName 
    where courseId = 6 
    and not exists (
       select 1 
       from TableName nested 
       where nested.userId = TableName.UserId 
       and nested.courseId = 11 
      ) 

选择分配给courseId 6,但尚未分配到courseId 11的所有用户,并插入一个新的记录插入到表他们courseId 11