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

Откуда:
Сообщений: 70
День добрый!

Пытаюсь синхронизировать две таблицы (@S = Source и @T = Target). В таблицах две колонки P = Parent и C = Child.

После MERGE данные для родителей из S (S.Parent) должны полностью соответствовать данным для этих же родителей из T.
Т.е. дети должны дописаться в T, если их там нет, но они есть в S. Дети должны удалиться из T, если они там есть, но их нет в S.

В имеющемся запросе используются жуткий фрагмент WHEN NOT MATCHED BY SOURCE AND T.P IN (SELECT P FROM @S) THEN DELETE - подскажите, плжслта, как от него избавиться, не ломая результат?

DECLARE @T TABLE (P INT, C INT)
DECLARE @S TABLE (P INT, C INT)

INSERT INTO @T SELECT -1, 1 UNION ALL SELECT -1, 2 UNION ALL SELECT 0, 0
INSERT INTO @S VALUES (-1, 1), (-1, 3)

SELECT '@T' 'T.BEFORE', * FROM @T
SELECT '@S' 'S.BEFORE', * FROM @S

MERGE @T T
USING ( SELECT C, P FROM @S ) AS S ( C, P ) ON S.P = T.P AND S.C = T.C
WHEN NOT MATCHED BY SOURCE AND T.P IN (SELECT P FROM @S) THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ( P, C ) VALUES ( S.P, S.C );

SELECT '@T' 'T.AFTER', * FROM @T
26 июл 11, 16:38    [11029513]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a139,

а зачем этот "жуткий" фрагмент?
Почему его не выбросить?
Какой в нём смысл?
26 июл 11, 16:55    [11029643]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
a139
Member

Откуда:
Сообщений: 70
iap
a139,

а зачем этот "жуткий" фрагмент?
Почему его не выбросить?
Какой в нём смысл?

Дети должны удалиться из T, если они там есть, но их нет в S.
26 июл 11, 16:59    [11029676]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a139
iap
a139,

а зачем этот "жуткий" фрагмент?
Почему его не выбросить?
Какой в нём смысл?

Дети должны удалиться из T, если они там есть, но их нет в S.
Простой пример данных показать можете?
Таблица-источник живёт же как-то с неудалёнными записями,
которые Вы всё равно хотите удалить в целевой?
26 июл 11, 17:07    [11029750]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
a139
Member

Откуда:
Сообщений: 70
iap
Простой пример данных показать можете?
Таблица-источник живёт же как-то с неудалёнными записями,
которые Вы всё равно хотите удалить в целевой?
Да вот собственно утрированный пример выше есть. S - это не настоящая таблица источник, это запрос. Я делаю импорт данных (из внешнего файла) для группы детей у которых одинаковый родитель.
26 июл 11, 17:14    [11029803]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
a139
День добрый!
В имеющемся запросе используются жуткий фрагмент WHEN NOT MATCHED BY SOURCE AND T.P IN (SELECT P FROM @S) THEN DELETE
- подскажите, плжслта, как от него избавиться
[/src]

Так вы хотите удалять то или нет я так и не понял. Если хотите - зачем от чего-то избавляться?
26 июл 11, 21:17    [11030798]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
a139
Member

Откуда:
Сообщений: 70
Fire83
Так вы хотите удалять то или нет я так и не понял. Если хотите - зачем от чего-то избавляться?
Хочу. Цитата: "После MERGE данные для родителей из S (S.Parent) должны полностью соответствовать данным для этих же родителей из T.
Т.е. дети должны дописаться в T, если их там нет, но они есть в S. Дети должны удалиться из T, если они там есть, но их нет в S."

Мне кажется, что в инструкции MERGE должна существовать более естественная форма записи запроса для достижения того же эффекта, нежели лишний AND T.P IN (SELECT P FROM @S). Просто прошу поделиться - как вы бы написали подобный запрос не видя моего.
5 авг 11, 11:42    [11075295]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
a139
День добрый!

Дети должны удалиться из T, если они там есть, но их нет в S.



Почему у вас тогда НЕ удаляется запись из таблицы @t c значениями 0, 0 ????


в принципе с этим условием должно быть просто, как пять копеек:

DECLARE @T TABLE (P INT, C INT)
DECLARE @S TABLE (P INT, C INT)

INSERT INTO @T SELECT -1, 1 UNION ALL SELECT -1, 2 UNION ALL SELECT 0, 0
INSERT INTO @S VALUES (-1, 1), (-1, 3)

SELECT '@T' 'T.BEFORE', * FROM @T
SELECT '@S' 'S.BEFORE', * FROM @S


merge @t t
using @s s on t.p=s.p and t.c=s.c
when not matched by target then insert (p,c) values (s.p, s.c)
when not matched by source then delete
;
SELECT '@T' 'T.AFTER', * FROM @T
5 авг 11, 12:14    [11075598]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
и вообще :-)

DECLARE @T TABLE (P INT, C INT)
DECLARE @S TABLE (P INT, C INT)

INSERT INTO @T SELECT -1, 1 UNION ALL SELECT -1, 2 UNION ALL SELECT 0, 0
INSERT INTO @S VALUES (-1, 1), (-1, 3)


delete  @t

insert @T select * from @s

select * from @t


5 авг 11, 12:18    [11075634]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
a139
Member

Откуда:
Сообщений: 70
Andrey Sribnyak
a139
День добрый!
Дети должны удалиться из T, если они там есть, но их нет в S.

Почему у вас тогда НЕ удаляется запись из таблицы @t c значениями 0, 0 ????
Потому что "После MERGE данные для родителей из S (S.Parent) должны полностью соответствовать данным для этих же родителей из T."

Т.е. слияние работает только для тех записей, у которых родители есть и в S и в T.
5 авг 11, 13:42    [11076297]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
a139
Member

Откуда:
Сообщений: 70
a139
Т.е. слияние работает только для тех записей, у которых родители есть и в S и в T.
Не то сказал: "Т.е. слияние работает только для тех записей, у которых родители есть в S."
5 авг 11, 13:46    [11076335]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация таблиц с помощью MERGE  [new]
БезMERGE
Guest
a139,

DECLARE @T TABLE (P INT, C INT)
DECLARE @S TABLE (P INT, C INT)

INSERT INTO @T SELECT -1, 1 UNION ALL SELECT -1, 2 UNION ALL SELECT 0, 0
INSERT INTO @S VALUES (-1, 1), (-1, 3)

SELECT '@T' 'T.BEFORE', * FROM @T
SELECT '@S' 'S.BEFORE', * FROM @S



delete from @T  where P IN (SELECT P FROM @S)

insert @T select * from @s


SELECT '@T' 'T.AFTER', * FROM @T
5 авг 11, 13:47    [11076349]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить