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