Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
Здравствуйте!

Задача состоит в том, чтобы запись с количеством Num одного товара ID слить с записью с количеством другого товара (т.е. сказать, что эти товары - суть одно и то же и поэтому мы хотим слить воедино ифнормацию о них в БД). Есть две строки, нужно получить одну строку.

Как проще всего это реализовать? Возможно ли все сделать через один MERGE?
Возможна как ситуация, что новый ID уже есть в данной таблице, также и то, что нового ID еще нет в данной таблице (в этом случае нам просто нужно изменить старый ID на новый).

DECLARE @ID1 INT = 3,
	@ID2 INT = 7

-- Дублей по ID быть не может
DECLARE @T TABLE (ID INT, Num INT, UNIQUE (ID))
INSERT	@T VALUES (@ID1, 10), (@ID2, 40), (123, 2), (456, 9)

SELECT * FROM @T

-- То, что хотелось бы получить на выходе, но не в SELECT`е, а в реальной таблице в БД (вместо @T реальная таблица)
SELECT ID, Num + ( SELECT Num FROM @T WHERE ID = @ID1 ) NewNum FROM @T WHERE ID = @ID2
UNION ALL
SELECT ID, Num FROM @T WHERE ID NOT IN ( @ID1, @ID2 )
18 май 12, 10:09    [12574714]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Glory
Member

Откуда:
Сообщений: 104751
a139
Как проще всего это реализовать? Возможно ли все сделать через один MERGE?

Самый важный вопрос - откуда серверу известны все сопоставления ID
Как в вашем примере, что @ID1= 3 соответствует @ID2 = 7
18 май 12, 11:38    [12575591]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
Glory
Самый важный вопрос - откуда серверу известны все сопоставления ID
Как в вашем примере, что @ID1= 3 соответствует @ID2 = 7
Входные параметры для моей процедуры замены:
1) ID1 INT -- Старый ID, что нужно заменить
2) ID2 INT -- Новый ID, на что нужно заменить
И существует таблица @T, где все эти замены нужно произвести.
18 май 12, 11:43    [12575638]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
a139
... также и то, что нового ID еще нет в данной таблице (в этом случае нам просто нужно изменить старый ID на новый).


тогда не с чем суммировать, если товара нет в таблице - или я чего-то не понял? по смыслу всегда должен быть 1 и 2 товар или же если 2 нет, то на вход должно подаваться его кол-во чтобы дописать его в 1 - или я чего-то не понял?...
18 май 12, 11:56    [12575760]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
SirMix
a139
... также и то, что нового ID еще нет в данной таблице (в этом случае нам просто нужно изменить старый ID на новый).

тогда не с чем суммировать, если товара нет в таблице - или я чего-то не понял? по смыслу всегда должен быть 1 и 2 товар или же если 2 нет, то на вход должно подаваться его кол-во чтобы дописать его в 1 - или я чего-то не понял?...
Есть @ID1, @ID2 во входных параметрах. Товары с @ID1 всегда есть в таблице, в отличии от товаров с @ID2. Если товаров с @ID2 нет в таблице, тогда должен вместо строки @ID1, Num должна получится строка @ID2, Num. Количество в этом случае не меняется.
18 май 12, 12:01    [12575800]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Glory
Member

Откуда:
Сообщений: 104751
a139
Товары с @ID1 всегда есть в таблице, в отличии от товаров с @ID2. Если товаров с @ID2 нет в таблице, тогда должен вместо строки @ID1, Num должна получится строка @ID2, Num. Количество в этом случае не меняется.

Ну так и в чем проблема то ?
В написании связки UPDATE+INSERT или MERGE ?
18 май 12, 12:24    [12576018]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
Glory, да - проблема в написании MERGE.
18 май 12, 12:29    [12576055]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Glory
Member

Откуда:
Сообщений: 104751
a139
Glory, да - проблема в написании MERGE.

И в чем же заключается проблема ?
18 май 12, 12:29    [12576063]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
Glory, я бы хотел, в идеале, получить готовый запрос для данного примера, чтобы затем (самому) сравнить его с моим.
18 май 12, 12:32    [12576104]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Glory
Member

Откуда:
Сообщений: 104751
a139
Glory, я бы хотел, в идеале, получить готовый запрос для данного примера, чтобы затем (самому) сравнить его с моим.

Ну так в чем же дело - публикуйте свой запрос
18 май 12, 12:33    [12576109]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
=(
Glory, я же написал "я бы хотел, в идеале, получить готовый запрос для данного примера, чтобы затем (самому) сравнить его с моим", т.е. не публикуя свой запрос.
18 май 12, 12:35    [12576134]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
a139
SirMix
пропущено...

тогда не с чем суммировать, если товара нет в таблице - или я чего-то не понял? по смыслу всегда должен быть 1 и 2 товар или же если 2 нет, то на вход должно подаваться его кол-во чтобы дописать его в 1 - или я чего-то не понял?...
Есть @ID1, @ID2 во входных параметрах. Товары с @ID1 всегда есть в таблице, в отличии от товаров с @ID2. Если товаров с @ID2 нет в таблице, тогда должен вместо строки @ID1, Num должна получится строка @ID2, Num. Количество в этом случае не меняется.


где взять этот самый Num для @ID2 если их нет в таблице?
18 май 12, 12:39    [12576182]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
SirMix
a139
пропущено...
Есть @ID1, @ID2 во входных параметрах. Товары с @ID1 всегда есть в таблице, в отличии от товаров с @ID2. Если товаров с @ID2 нет в таблице, тогда должен вместо строки @ID1, Num должна получится строка @ID2, Num. Количество в этом случае не меняется.


где взять этот самый Num для @ID2 если их нет в таблице?
Из @ID1
18 май 12, 12:48    [12576273]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a139
=(
Glory, я же написал "я бы хотел, в идеале, получить готовый запрос для данного примера, чтобы затем (самому) сравнить его с моим", т.е. не публикуя свой запрос.
Мне кажется что этой строкой вы закрили тему.
Признавать ошибки важнее, чем их не совершать. Это обычное дело, как почистить зубы.
18 май 12, 14:00    [12576936]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
Glory
Member

Откуда:
Сообщений: 104751
DECLARE @ID1 INT , @ID2 INT
SET @ID1 = 3
SET @ID2 = 7
DECLARE @T TABLE (ID INT, Num INT, UNIQUE (ID))
INSERT	@T VALUES (@ID1, 10)
INSERT	@T VALUES (@ID2, 40)
INSERT	@T VALUES (123, 2)
INSERT	@T VALUES (456, 9)

SELECT * FROM @T

MERGE @T AS targt
USING (
SELECT @ID1 AS NEW_ID, 0 as act, SUM(Num) as New_Num, COUNT(*) AS cnt 
FROM @T 
WHERE ID IN ( @ID1)
UNION ALL
SELECT @ID2 AS NEW_ID, 1 as act, SUM(Num) as New_Num, COUNT(*) AS cnt 
FROM @T 
WHERE ID IN ( @ID1, @ID2 )
       ) AS source(New_ID, act, New_Num, cnt)
ON (targt.ID = source.New_ID)
WHEN MATCHED AND source.act = 0 THEN DELETE
WHEN MATCHED AND source.act = 1 AND source.cnt=2 THEN UPDATE SET Num = source.New_Num, ID = source.New_ID
WHEN NOT MATCHED AND source.act = 1 AND source.cnt=1 THEN INSERT (ID, Num) VALUES(source.New_ID, source.New_Num)
OUTPUT deleted.*, $action, inserted.* ;

SELECT * FROM @T
18 май 12, 15:07    [12577631]     Ответить | Цитировать Сообщить модератору
 Re: Слияние двух записей в таблице (с предварительной заменой значений ID колонки)  [new]
a139
Member

Откуда:
Сообщений: 70
Glory, спасибо!
То, что нужно.
18 май 12, 16:06    [12578453]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить