簡體   English   中英

SQL - 根據另一個表條目將新行插入現有表

[英]SQL - Insert new row into an existing table based on another table entry

我有公司表和許可證表。 我需要在許可證表中為公司表中尚未包含在許可證表中的每個公司插入一個新行。

License (ID,CompanyID,LicenseStart,LicenseEnd,CreatedDate,AddUser,UpdateUser,UpdateDate,TemplateId)添加新行時,此表中的ID增加1。

Company (ID,Name,CreateDate,CState,LocationID,LegalName)

將為許可證表中尚未包含的每個CompanyID輸入的默認值應如下所示。

Insert (ID, @theCompanyID, GetDate(), DATEADD(day,14,GETDATE()), null,null,null,null null)

@theCompanyID將是不在許可證表中的CompanyID

我是新手,所以任何幫助將不勝感激。

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
                     );

使用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)
INSERT INTO License (CompanyID, LicenseStart, LicenseEnd)
SELECT ID, GetDate(), DATEADD(day,14,GETDATE())
FROM Company
WHERE ID NOT IN
(
    SELECT DISTINCT CompanyID
    FROM License
)

您可以使用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

另一種方法是使用EXCEPT運算符,它比subqueryjoin更快,因為它是一個set函數。

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

由於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問題中指定的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM