[英]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
運算符,它比subquery
或join
更快,因為它是一個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.