Sql Server Вставляет значения в таблицу на основе существующих строк

#sql-server

#sql-сервер

Вопрос:

У меня есть таблицы tbl1 и tbl2, как показано ниже:

tbl1:

 ID      Date1        Date2
1       2020-05-11   2020-09-14
1       2020-06-13   2020-09-14
1       2020-07-15   2020-09-14
2       2020-10-01   2020-09-14
  

tbl1:

 ID      Date1        Date2       ID2
 1     2020-05-11    NULL        15
 1     2020-06-13    2020-10-01  15
 1     2020-04-10    NULL        15
  

Мне нужно вставить строки в tbl2 из tbl1, если идентификатор и Date1 еще не существуют в tbl2. Мой вывод должен выглядеть следующим образом:
tbl2:

 ID      Date1        Date2      ID2
 1     2020-05-11    NULL       15
 1     2020-06-13    2020-10-01 15
 1     2020-04-10    NULL       15
 1     2020-07-15    2020-09-14 15
 2     2020-10-01    2020-09-14 15
  

Я пытался использовать оператор except, но он не работает. Каков наилучший способ сделать это?

Ответ №1:

Использовать not exists :

 insert into tbl2 (id, date1, date2, id2)
select t1.id, t1.date1, t1.date2, 15
from tbl1 t1
where not exists (select 1 from tbl2 t2 where t2.id = t1.id and t2.date1 = t1.date1)
  

Мне неясно, что вы хотите от id2 , поэтому приведенный выше запрос жестко кодирует значение 15 . Может быть, вы хотите что-то динамическое на основе доступных значений в целевой таблице — если это так:

 insert into tbl2 (id, date1, date2, id2)
select t1.id, t1.date1, t1.date2, ti.id2    
from tbl1 t1
cross join (select distinct id2 from tbl1) ti
where not exists (select 1 from tbl2 t2 where t2.id = t1.id and t2.date1 = t1.date1 and t2.id2 = ti.id2)