|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Добрый день. Хочу использовать оператор merge в обновлении таблицы. Условие такое: в таблице 5 полей (mag_id, val1_id, val2_id, ver_id, year_id). Когда добавляются в таблицу target_table данные, то если ver_id и year_id совпадают c ver_id, year_id в таблице source_table, то старые данные по ver_id и year_id надо удалить из target_table и вставить все данные из source_table. Если ver_id и year_id не совпадают, то данные из source_table добавляются в target_table. Если использовать условие соединения (ON) по всем 5 полям, то получается соединение один-к-одному: Код: sql 1. 2. 3. 4. 5.
ошибка: авторMsg 5333, Level 16, State 2, Line 54 The identifier 't1.VER_ID' cannot be bound. Only source columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement. Msg 5333, Level 16, State 2, Line 54 The identifier 't1.year_id' cannot be bound. Only source columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED' clause of a MERGE statement. Msg 5334, Level 16, State 2, Line 53 The identifier 't2.ver_id' cannot be bound. Only target columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED BY SOURCE' clause of a MERGE statement. Msg 5334, Level 16, State 2, Line 53 The identifier 't2.year_id' cannot be bound. Only target columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED BY SOURCE' clause of a MERGE statement. Если использовать соединение по 2м полям ver_id, year_id, то получается соединение много-ко-многим Код: sql 1. 2. 3. 4. 5.
Ошибка: авторMsg 8672, Level 16, State 1, Line 21 The MERGE statement attempted to UPDATE or DELETE the same row more than once. This happens when a target row matches more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the target table multiple times. Refine the ON clause to ensure a target row matches at most one source row, or use the GROUP BY clause to group the source rows. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 14:52 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Если не фантазировать, а прочесть таки эти сраные мануалы: "merge работает ТОЛЬКО по принципу ОДНА строка таргета <-> ОДНОЙ строке соурс." Поэтому, для получения желаемой пены у рта надо тупо пронумеровать строки таргета и соурса Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:25 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
aleks222 Код: sql 1. 2. 3.
а это для чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:38 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Диана Орел то старые данные по ver_id и year_id надо удалить из target_table Наверное... за вот этим? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 16:41 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
aleks222, Спасибо за идею!!! (жаль, сама не догадалась. ) Вопрос, что означает order by 1/0? Запрос у меня получился такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
то есть: - если все 5 полей одинаковы, то обновление строки - если только версия и год одинаковы, а любое из 3х полей отличается, то удаляем строку - если нет такой версии и года, то добавляем строку ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 17:59 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Диана Орел aleks222, Спасибо за идею!!! (жаль, сама не догадалась. ) Вопрос, что означает order by 1/0? Запрос у меня получился такой: Код: sql 1. 2. 3. 4. 5. 6. 7.
то есть: - если все 5 полей одинаковы, то обновление строки - если только версия и год одинаковы, а любое из 3х полей отличается, то удаляем строку - если нет такой версии и года, то добавляем строку Незамутненный бред. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 19:23 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Диана ОрелВопрос, что означает order by 1/0? https://sqlperformance.com/2019/11/t-sql-queries/row-numbers-with-nondeterministic-order ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2022, 21:00 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
aleks222, поняла ваш вариант, наконец, я добавила условие, но видимо вы так подразумавали Код: sql 1. 2. 3. 4. 5. 6.
- если версия и год совпадают, то все остальные поля обновить - если нет такой строки в исходной таблице, то ужалить строку - если нет такой строки в целевой таблице, то вставить Сравню планы выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 08:36 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Диана Орел aleks222, поняла ваш вариант, наконец, я добавила условие, но видимо вы так подразумавали Код: sql 1. 2. 3. 4. 5. 6.
- если версия и год совпадают, то все остальные поля обновить - если нет такой строки в исходной таблице, то ужалить строку - если нет такой строки в целевой таблице, то вставить Сравню планы выполнения Ну, осталось савсем немного... до просветления... А там, можно и нумерацию похерить. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 08:40 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
aleks222, без ROW_NUMBER() Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 10:05 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
Диана Орел aleks222, без ROW_NUMBER() Код: sql 1. 2. 3. 4. 5. 6. 7.
Позор. Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 10:12 |
|
Merge возможен при условиях
|
|||
---|---|---|---|
#18+
aleks222 Код: sql 1. 2. 3. 4. 5. 6.
круто, спасибо за опыт ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2022, 10:47 |
|
|
start [/forum/topic.php?fid=46&msg=40127237&tid=1683913]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 243ms |
total: | 514ms |
0 / 0 |