SCD типа 2 с помощью оператора слияния для отслеживания изменений в объединенной таблице без уникального ключа

У меня есть таблица, для которой я хочу создать SCD Type 2 с помощью T-SQL Merge statement, однако у нее нет уникального ключа.

RoleTaskTable:
RoleID, TaskID
1,A
1,B
1,C
2,A
2,D
2,F
3,A
3,B
3,E
3,F

Очевидно, я получаю ошибку

"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."

Когда я комбинирую RoleID и TaskID в качестве уникального индекса для промежуточной таблицы, а также для таблицы SCDT, она распознается просто как новая запись, поэтому все записи (даже если некоторые из них удалены) остаются помеченными как активные в таблице SCD.

Как вы можете решить что-то подобное?

На всякий случай я могу показать весь код, который у меня есть для этого SCD, но я думаю, что здесь упущено что-то основное.


person titatovenaar    schedule 28.08.2019    source источник


Ответы (1)


Рискуя показаться очевидным, дайте таблице уникальный ключ. Без одного это не правильное отношение. Merge предназначен для работы с уникальными ключами.

OTOH, поскольку Merge — это всего лишь универсальный инструмент для вставки/обновления/удаления, вы можете использовать отдельные команды, заключенные в транзакцию, для выполнения того же самого.

person user1443098    schedule 28.08.2019
comment
Будет ли хорошей идеей дать таблице уникальный RowNumber, который никогда не может быть изменен, поэтому, если записи будут удалены, она продолжит подсчет с самой высокой цифрой, которая когда-либо использовалась? - person titatovenaar; 28.08.2019
comment
Это может быть хорошо, но, вероятно, не подойдет для оператора MERGE OP, который должен смотреть на бизнес-ключи. - person user1443098; 28.08.2019