SQL - 根据另一个表的条目向现有表中插入新行

4
我有一个公司表和一个许可证表。我需要在许可证表中为每个不在许可证表中的公司插入一行新数据。
许可证表结构如下:License (ID,CompanyID,LicenseStart,LicenseEnd,CreatedDate,AddUser,UpdateUser,UpdateDate,TemplateId),每次添加新数据时,ID会自动递增。
公司表结构如下:Company (ID,Name,CreateDate,CState,LocationID,LegalName) 对于每个不在许可证表中的公司,应该输入以下默认值: Insert (ID, @theCompanyID, GetDate(), DATEADD(day,14,GETDATE()), null,null,null,null null) 其中,@theCompanyID是不在许可证表中的公司的ID。
由于我刚接触这个领域,所以非常感谢您的帮助。

2
你使用的是哪种关系型数据库管理系统? - Politank-Z
@Politank-Z SQL Server 2012 抱歉。 - Jazz
插入语句中的ID是否自动生成?你的两个表是如何设计的? - John Odom
许可证表中的ID会自动加1。 - Jazz
6个回答

6

license.id是一个自增列,因此您不需要插入它。

insert into license (CompanyID, LicenseStart, LicenseEnd)
    select c.id, GetDate(), DATEADD(day, 14, GETDATE())
    from company c
    where not exists (select 1
                      from license l
                      where c.ID = l.CompanyID
                     );

如果您不需要为某些列提供值,那么也无需插入明确的NULL值。默认设置这些值为NULL

如果您的开始日期和结束日期没有时间组件 - 仅有日期 - 则请改用此选项:

    select c.id, cast(GetDate() as date), cast(DATEADD(day, 14, GETDATE()) as date)
    from company c
    where not exists (select 1
                      from license l
                      where c.ID = l.CompanyID
                     );

1

使用SELECT进行INSERT,使用NOT EXISTS确保不会再次插入现有公司。类似于:

insert into license (ID,CompanyID,LicenseStart,LicenseEnd,CreatedDate,AddUser,UpdateUser,UpdateDate,TemplateId)
select ID, theCompanyID, GetDate(), DATEADD(day,14,GETDATE()), null,null,null,null null
from company
where not exists (select 1 from company
                  where company.CompanyID = license.CompanyID)

是的,我知道,Jazz在这里需要做一些工作...这就是为什么我写了“类似于”... - jarlh

1
INSERT INTO License (CompanyID, LicenseStart, LicenseEnd)
SELECT ID, GetDate(), DATEADD(day,14,GETDATE())
FROM Company
WHERE ID NOT IN
(
    SELECT DISTINCT CompanyID
    FROM License
)

1

你可以使用 LEFT JOIN 完成它:

INSERT  INTO License
        ( CompanyID ,
          LicenseStart ,
          LicenseEnd ,
          CreatedDate ,
          AddUser ,
          UpdateUser ,
          UpdateDate ,
          TemplateId
        )
        SELECT  ID ,
                GETDATE() ,
                DATEADD(DAY, 14, GETDATE()) ,
                NULL ,
                NULL ,
                NULL ,
                NULL ,
                NULL
        FROM    Company c
                LEFT JOIN License l ON l.CompanyID = c.ID
        WHERE   l.ID IS NULL

1

另一种方法是使用 EXCEPT 运算符,它比使用 子查询联接 更快,因为它是一个集合函数。

Insert License

select a.CompanyID, GetDate(), DATEADD(day,14,GETDATE()), null,null,null,null null
from 
    (select id from company 
    except
    select CompanyID from License
    )a

1

由于OP已经说过许可证表中的ID是递增1的,所以您可以这样编写查询:

INSERT INTO License(CompanyID,LicenseStart,LicenseEnd)
SELECT c.ID, GetDate(), DATEADD(day,14,GETDATE()))
FROM Company c
WHERE NOT EXISTS
(
    SELECT l.CompanyID
    FROM License l
    WHERE l.CompanyID = c.ID
)

如果列是自动递增的,则在INSERT语句中不需要指定该列。此外,我选择在`WHERE`子句中使用NOT EXISTS而不是NOT IN,原因是Martin Smith在这个Stack Overflow question中指定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接