Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
_Промешан_ Member Откуда: Сообщений: 970 |
Ситуация. Таргет - нормализованная таблица с названиями и идентификаторами Сорс - куча данных с названиями, но без идентификаторов. Задача. 1. Нужно вставить из Сорса дистинкт значения, которых нет в таблице. 2. Нужно всей куче Сорса "достать" идентификаторы. create table #t (id int, data varchar(100)); insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc'); ;MERGE #t AS target USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data) ON (target.data = source.data) WHEN NOT MATCHED THEN INSERT (id,data) VALUES (source.id,source.data) output inserted.*; drop table #t; В таком случае будет аутпут только вставок. Чтобы весь сорс был в аутпут, надо ставить WHEN MATCHED и что то апдейтить. Но это лишняя операция. |
21 июн 16, 19:08 [19320182] Ответить | Цитировать Сообщить модератору |
_Промешан_ Member Откуда: Сообщений: 970 |
Можно сделать конечно так. create table #t (id int, data varchar(100)) insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc') SELECT id,data into #r from (values (4,'qwe'),(3,'trt'))a(id,data) where exists(select 1 from #t where data=a.data) insert into #t output inserted.* into #r SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data) where not exists(select 1 from #t where data=a.data) select * from #r drop table #t drop table #r Но уж больно монстряво, когда есть мерж. |
21 июн 16, 19:13 [19320193] Ответить | Цитировать Сообщить модератору |
i-i
Guest |
Obijavlaem peremennuu, naprimer @i int i v WHEN MATCHED ee updatim |
24 июн 16, 22:59 [19334025] Ответить | Цитировать Сообщить модератору |
0-0
Guest |
_Промешан_, ? declare @i int = 1 create table #t (id int, data varchar(100)); insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc'); ;MERGE #t AS target USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data) ON (target.data = source.data) WHEN NOT MATCHED THEN INSERT (id,data) VALUES (source.id,source.data) when matched then update set @i = 1 output inserted.*; drop table #t; |
28 июн 16, 11:18 [19344084] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
declare @i int = 1 create table #t (id int, data varchar(100)); insert #t (id, data) values (0, 'qwe'),(1,'asd'),(2,'zxc'); DECLARE @t_output TABLE (id int, data varchar(100)); ; INSERT INTO @t_output SELECT * FROM ( MERGE #t AS target USING (SELECT id,data from (values (4,'qwe'),(3,'trt'))a(id,data)) as source (id,data) ON (target.data = source.data) WHEN NOT MATCHED THEN INSERT (id,data) VALUES (source.id,source.data) when matched then update set @i = 1 output inserted.* ) X; SELECT DISTINCT * FROM @t_output drop table #t; |
28 июн 16, 13:09 [19344841] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
a_voronin, На что хотели обратить внимание своим примером? |
28 июн 16, 13:33 [19345024] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Вас побудоражить |
||
28 июн 16, 13:42 [19345093] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
А я уж подумал, что в кои-то веки что-то умное написали... |
||
28 июн 16, 14:16 [19345409] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |