2016-09-22 3 views
0

У меня есть две таблицы A и B с отношением Один-ко-многим от A до B.Лучший способ проверить дублированные записи

А имеет 5 колонок:

a1, a2, a3, a4, a5 

и B имеет 5 колонок

b1, b2, b3, b4, a1. 

Примечание a1 является внешним ключом в таблице В.

У меня есть требование, чтобы проверить повторяющиеся записи в таблица, т.е. две записи не должны иметь одинаковых значений для всех атрибутов.

Самый эффективный способ, который я могу придумать для определения их уникальности, - это создать ценность контрольной суммы и сохранить ее в каждой строке таблицы A. Но для этого требуется дополнительное пространство, и мне нужно будет убедиться, что контрольная сумма действительно уникальный.

Это лучший способ продвинуться вперед или есть какой-то другой способ, о котором я не знаю?

См., Например, Скажем, таблица A is Rules Таблица и таблица B is Trigger таблица. Теперь таблица Rules содержит записи различных правил, созданных разными пользователями. (Это означает, что будет отображаться таблица Users Таблица в таблице Rules.). Теперь я хочу, чтобы пользователь не мог создавать одинаковые правила. Поэтому, когда пользователь сохраняет правила, я запускаю запрос, чтобы проверить, есть ли запись идентичной контрольной суммы для этого конкретного пользователя, если да, то я даю соответствующую ошибку, иначе я позволю пользователю создать запись. Я думаю, это позволяет понять, почему я могу " t ставит уникальное ограничение для всех записей.

+2

Пропустить контрольную сумму. (Должно управляться с помощью триггеров.) Почему бы не создать уникальное ограничение, то есть «уникальное (a1, a2, a3, a4, a5)». – jarlh

+0

Примеры данных и ожидаемые результаты могут быть полезны здесь ... – sgeddes

+0

Вы хотите устранить существующие дубликаты? идентифицировать их для удаления или предотвратить их появление в первую очередь? (1,2 все 3?) – xQbert

ответ

1

Сделать SELECT с предложением GROUP BY. Например:

SELECT a1, a2, a3, a4, a5, COUNT(*) FROM #TempPersons GROUP BY a1, a2, a3, a4, a5 HAVING COUNT(*) > 1; 

Это будет возвращать результат с a1, a2, a3, a4, a5 и подсчетом, сколько раз кажется, что значение

+0

На самом деле это не поможет мне, потому что мне нужно кое-что проверить. Прежде чем вставлять новую запись, я хочу проверить, существует ли этот вид данных для определенного пользователя, я обновляю свой вопрос для получения более подробной информации. –

+0

Нет, Furquand. Вы выполняете 'INSERT'. Если вы получаете ошибку «dup key», вы плюете на пользователя. Если вы не получите эту ошибку, она будет вставлена. –

1

Имея UNIQUE ограничения на этих колонках кажется, что путь.

Однако, только для того, чтобы ответить на ваши другие замечания: я работал с дополнительными столбцами, чтобы проверить изменения в прошлом раньше. Тогда я сделал что-то похожее на это:

CONVERT([NVARCHAR](42),HASHBYTES('SHA1',CONCAT(Column1, '||', Column2, ...),(1)) 

я нашел, что это довольно хороший способ Concat много столбцов в один хэш, уникальное в зависимости от его содержимого & без него дует из пропорции. (Я использовал это в среде datawarehousing, чтобы проверить большие таблицы для изменений уровня записи на основе бизнес-ключа. Хранили это как столбец PERSISTED, чтобы он мог также работать с индексом).