powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Действие DELETE в MERGE
22 сообщений из 22, страница 1 из 1
Действие DELETE в MERGE
    #39965881
saszay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Помогите разобраться в действием DELETE в MERGE команде.
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MERGE dbo.SendPrice as dst
        USING (SELECT tosuID, price from @tblL where tosuID is not null) as src
        ON dst.viID = -2 AND dst.toID IS NULL AND dst.tosuID = src.tosuID
        WHEN NOT MATCHED THEN
            INSERT (viID,     tosuID,     spSum,  spSumOld, spKey, spType, spKey1)
              VALUES (-2, src.tosuID, src.Price,     src.Price,       0,          1,      0,)
        WHEN NOT MATCHED BY SOURCE THEN
            DELETE
        WHEN MATCHED AND dst.spSum <> src.Price THEN
            UPDATE SET spSumOld = spSum,
                       spSum    = src.Price,
                       spDate   = SYSDATETIME();



Почему-то DELETE удаляет все записи из таблицы, на не только viID = -2.
На какие записи тогда действует DELETE?
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39965904
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay
На какие записи тогда действует DELETE?
not matched by source - строки целевой таблицы, не совпавшие с источником по предикатам соединения. Т.е. вся таблица.
Напишите так
Код: sql
1.
2.
        WHEN NOT MATCHED BY SOURCE and dst.viID = -2 THEN
            DELETE


А лучше так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MERGE (select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2) as dst
        USING (SELECT tosuID, price from @tblL where tosuID is not null) as src
        ON dst.viID = -2 AND dst.toID IS NULL AND dst.tosuID = src.tosuID
        WHEN NOT MATCHED THEN
            INSERT (viID,     tosuID,     spSum,  spSumOld, spKey, spType, spKey1)
              VALUES (-2, src.tosuID, src.Price,     src.Price,       0,          1,      0,)
        WHEN NOT MATCHED BY SOURCE THEN
            DELETE
        WHEN MATCHED AND dst.spSum <> src.Price THEN
            UPDATE SET spSumOld = spSum,
                       spSum    = src.Price,
                       spDate   = SYSDATETIME();
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39965933
saszay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но в соединении ведь указано dst.viID = -2. Оно не берётся в расчёт?
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39965982
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay
Но в соединении ведь указано dst.viID = -2. Оно не берётся в расчёт?

оно как раз и портило всё, не привязывая записи источника и получателя
Сделайте как показал invm и всё будет хорошо
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39965984
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay,

SOURCE это все записи выбираемые запросом

Код: sql
1.
SELECT tosuID, price from @tblL where tosuID is not null



DESTINAION это все записи из таблицы dbo.SendPrice
или
Код: sql
1.
select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2

по invm

Соответственно DELETE будет применять в первом случае к dbo.SendPrice, во втором случае к
Код: sql
1.
select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39965996
saszay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin
saszay,

DESTINAION это все записи из таблицы dbo.SendPrice
или
Код: sql
1.
select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2

по invm

Соответственно DELETE будет применять в первом случае к dbo.SendPrice, во втором случае к
Код: sql
1.
select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2



Это ведь одинаковые записи... Про вариант invm я понял. Он 100% защитит остальные записи в SendPrice?
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966007
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay,

DELECT FROM T
FROM (select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2 ) T
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966014
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay
Но в соединении ведь указано dst.viID = -2. Оно не берётся в расчёт?
Что такое FULL OUTER JOIN знаете?
Так вот, MERGE с NOT MATCHED и NOT MATCHED BY SOURCE - это FULL OUTER JOIN
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966015
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay,

правильней условие where viID = -2 приписывать сразу к target что бы не насиловать всё
я так но это не принципиально, выше описано тоже правильно

Код: sql
1.
2.
3.
;WITH T AS
(select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2) 
MERGE T ....
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966060
saszay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант invm не проходит по синкатситу:
Код: sql
1.
Incorrect syntax near '('.


Ругается на первую скобку после Merge
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966067
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay,

лишняя запятая после нуля у Вас в запросе. Несложно заметить.
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966143
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
saszay,

правильней условие where viID = -2 приписывать сразу к target что бы не насиловать всё
я так но это не принципиально, выше описано тоже правильно

Код: sql
1.
2.
3.
;WITH T AS
(select viID, tosuID, spSum, spSumOld, spKey, spType, spKey1 from dbo.SendPrice where viID = -2) 
MERGE T ....



Есть еще вариант написать

Код: sql
1.
2.
WHEN NOT MATCHED BY SOURCE AND T.viID = -2 
    THEN DELETE  ;



Вообще TCу уже давно прочитать доку по мерджу
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966163
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot a_voronin#22145715]
TaPaK
saszay,


Есть еще вариант написать

Код: sql
1.
2.
WHEN NOT MATCHED BY SOURCE AND T.viID = -2 
    THEN DELETE  ;



Вообще TCу уже давно прочитать доку по мерджу

этот вариант будет мержить весь источник и при большом обхекте это плохо
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966170
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(кто-то должн сказать и это)
а Короткевич рекомендовал не пользоваться MERGE командой )
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966190
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavy
(кто-то должн сказать и это)
а Короткевич рекомендовал не пользоваться MERGE командой )


А Длинноязыкович в ответ спросил, а зачем пользоваться UPDATE, DELETE и INSERT, если есть MERGE ?
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966218
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavy
(кто-то должн сказать и это)
а Короткевич рекомендовал не пользоваться MERGE командой )


ну так привели бы ссылку - тогда можно было бы и обсуждать

ps сам люблою юзать (правда в режиме I/U , с D почему-то не люблю - м.б потмоу что в оракле не юзал
да там и не было раньше вроде )

- но допускаю что да есть случаи когда I/U/D лушче
ну даже хотя бы чтобы отловить кол-во I/U/D по отдельности (скажем для лога в ETL)
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966248
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор ну так привели бы ссылку - тогда можно было бы и обсуждать
https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966280
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257
Гулин Федорну так привели бы ссылку - тогда можно было бы и обсуждать

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ Да, список багов впечатлил, притом почти большинство даже не начали рассматривать :-)

И интересно, что описания багов закрыты для России, смог открыть только через прокси.
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966281
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257
Гулин Федорну так привели бы ссылку - тогда можно было бы и обсуждать

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ Вот бы сейчас в 2020м году смотреть на баги, которые в 2012 пофиксили.
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966282
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Вот бы сейчас в 2020м году смотреть на баги, которые в 2012 пофиксили.
Дима про это написал в 18-м.Аарон последний раз апдэйтил пост в 18-м.
Некоторые там закрыли, это он ошибся, но некоторые, судя по всему, остались, особенно те, которые были стёрты (что бы начать жизнь с чистого листа) с закрытием Microsoft Connect
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966285
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Гавриленко Сергей Алексеевич
пропущено...
Вот бы сейчас в 2020м году смотреть на баги, которые в 2012 пофиксили.
Дима про это написал в 18-м.Аарон последний раз апдэйтил пост в 18-м.
Некоторые там закрыли, это он ошибся, но некоторые, судя по всему, остались, особенно те, которые были стёрты (что бы начать жизнь с чистого листа) с закрытием Microsoft Connect
Скорее всего то, что имело смысл фиксить, пофиксили, просто не сочли нужным отчитаться. За 12 лет с этим даже МС справился бы.
...
Рейтинг: 0 / 0
Действие DELETE в MERGE
    #39966351
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saszay
Добрый день!
Помогите разобраться в действием DELETE в MERGE команде.
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MERGE dbo.SendPrice as dst
        USING (SELECT tosuID, price from @tblL where tosuID is not null) as src
        ON dst.viID = -2 AND dst.toID IS NULL AND dst.tosuID = src.tosuID
        WHEN NOT MATCHED THEN
            INSERT (viID,     tosuID,     spSum,  spSumOld, spKey, spType, spKey1)
              VALUES (-2, src.tosuID, src.Price,     src.Price,       0,          1,      0,)
        WHEN NOT MATCHED BY SOURCE THEN
            DELETE
        WHEN MATCHED AND dst.spSum <> src.Price THEN
            UPDATE SET spSumOld = spSum,
                       spSum    = src.Price,
                       spDate   = SYSDATETIME();



Почему-то DELETE удаляет все записи из таблицы, на не только viID = -2.
На какие записи тогда действует DELETE?


Не учите младенцев плохому.
Derived Table - вот истинный дао.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MERGE ( select * from dbo.SendPrice where viID = -2 ) as dst
        USING (SELECT tosuID, price from @tblL where tosuID is not null) as src
        ON dst.toID IS NULL AND dst.tosuID = src.tosuID
        WHEN NOT MATCHED THEN
            INSERT (viID,     tosuID,     spSum,  spSumOld, spKey, spType, spKey1)
              VALUES (-2, src.tosuID, src.Price,     src.Price,       0,          1,      0,)
        WHEN NOT MATCHED BY SOURCE THEN
            DELETE
        WHEN MATCHED AND dst.spSum <> src.Price THEN
            UPDATE SET spSumOld = spSum,
                       spSum    = src.Price,
                       spDate   = SYSDATETIME();
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Действие DELETE в MERGE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]