2015-05-18 2 views
4

У меня есть таблица компаний и таблица лицензий. Мне нужно вставить новую строку в таблицу лицензий для каждой компании в таблице компании, которая еще не указана в таблице лицензий.SQL - Вставить новую строку в существующую таблицу на основе другой записи таблицы

License (ID,CompanyID,LicenseStart,LicenseEnd,CreatedDate,AddUser,UpdateUser,UpdateDate,TemplateId) Идентификатор этой таблицы увеличивается на 1 при добавлении новой строки.

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

Значение по умолчанию, которые будут введены для каждого CompanyID, который уже не в таблице лицензий должно выглядеть примерно так.

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

@theCompanyID бы быть CompanyID, что не в таблице лицензий

Я новичок в этом, так что любая помощь будет оценена.

+2

Какие СУБД вы используете? –

+0

@ Politank-Z SQL Server 2012 извините – Jazz

+0

Является ли идентификатор в инструкции insert автоматически сгенерирован? Как создаются ваши две таблицы? –

ответ

3

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

Сделайте INSERT с SELECT, используйте 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) 
+0

Да, я знаю, Джаз должен сделать какую-то работу здесь ... Вот почему я написал «Что-то вроде» ... – 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, который работает быстрее, чем subquery или join, поскольку он является функцией набора.

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 заявлении если столбец автоматически увеличивается. Также я решил использовать NOT EXISTS вместо NOT IN в предложении WHERE по той причине, что Мартин Смит указал в этом Stack Overflow question.

Смежные вопросы