|
merge when not matched by source
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Задача: для некоторого значения :EXTID синхронизовать соответствующую часть таблицы TGT c таблицей SRC, то есть совпадающие по ID записи обновить, отсутствующие в TGT, но существующие в SRC - добавить, лишние - удалить. Хочу использовать оператор merge, который вроде бы как раз для таких задач и создан. Никогда раньше с ним не работал, прошу не бить тапками. Пишу нечто следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Вопросов, собственно, 2: 1) Как правильно (лучше, эффективнее) поставить условие по EXTID? 2) Как удалять лишние записи, то есть те, которые есть в TGT, но которых нет в SRC? Подсмотрел в MSSQL кляузу by source специально для этого случая, но Firebird такую не поддерживает. Как бы её сэмулировать? Firebird 3.0.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2020, 19:32 |
|
merge when not matched by source
|
|||
---|---|---|---|
#18+
shalamyansky, есть кляуза "when no matched and condition". Т.е. можно задать несколько условий в одном операторе. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 09:55 |
|
merge when not matched by source
|
|||
---|---|---|---|
#18+
shalamyansky, 1. эффективнее в ON или в using(select ... where ...), ибо может задействовать индекс, но это не всегда подходит. Иногда лучше дополнить условия WHEN MATCHED и WHEN NOT MATCHED. А если таких условий несколько, то это делать придётся в любом случае 2. В рамках одного запрос никак. Можно разбить на два запроса и засунуть их в EXECUTE BLOCK ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 10:04 |
|
merge when not matched by source
|
|||
---|---|---|---|
#18+
Симонов Денис 2. В рамках одного запрос никак. Можно разбить на два запроса И каков будет запрос на удаление лишних записей? Подозреваю, что delete where not exists, а это оказывается нехорошо, как объясняется в теме ниже . А посредством merge удалить лишние записи получается, что не получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 15:35 |
|
merge when not matched by source
|
|||
---|---|---|---|
#18+
Но это не большая беда. Потому что можно составить вот такую процедуру, где за один проход сразу по двум курсорам и обновить, и вставить, и удалить лишние: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 15:40 |
|
merge when not matched by source
|
|||
---|---|---|---|
#18+
shalamyansky Симонов Денис 2. В рамках одного запрос никак. Можно разбить на два запроса И каков будет запрос на удаление лишних записей? Подозреваю, что delete where not exists, а это оказывается нехорошо, как объясняется в теме ниже . А посредством merge удалить лишние записи получается, что не получается. если у кого-то что-то тормозит, то это не обязательно будет тормозить у тебя. У автора того топика весьма витиеватый запрос ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:03 |
|
|
start [/forum/topic.php?fid=40&msg=39936707&tid=1560414]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
134ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 248ms |
0 / 0 |