Найти, какой столбец отличается между 2 рядами? - PullRequest
1 голос
/ 04 января 2012

Мы используем таблицы аудита для каждой операционной таблицы, в которой хранится предыдущее значение ее операционного эквивалента плюс дата изменения, тип изменения (UPDATE или DELETE) и собственный автоинкрементальный первичный ключ.

Итак, для таблицы Users с столбцами UserID, Name, Email будет таблица xUsers с идентификатором столбцов, OpererationType, OperationDate, UserID, Name, Email.

Обратите внимание, что таблица xTable содержит каждый столбец, который есть у его 'родителя' с 3 дополнительными полями. Этот шаблон повторяется для всех таблиц, используемых нашей системой.

Таблица пользователей:

UserID           int    
Name             nvarchar
Email            nvarchar

таблица xUsers:

    xUserID          int    
    OpererationType  int
    OperationDate    datetime
    UserID           int    
    Name             nvarchar
    Email            nvarchar

Теперь мой вопрос: Если у меня есть определенный UserID, для которого есть две записи в таблице xUsers, когда электронное письмо было изменено дважды,

как мне построить запрос, который определяет, какие столбцы (могут быть больше 1) отличаются между двумя строками в таблице аудита?

Ответы [ 2 ]

3 голосов
/ 04 января 2012

Если я правильно понимаю, вы хотите создать запрос, передавая в качестве параметра идентификатор пользователя, который я буду называть @UserID для следующего примера.

Этот запрос выберет все строки из xUsers, соединенных с самим собой, если есть разница в столбце, отличном от UserID, с использованием серии операторов case (по одному на столбец), чтобы конкретно определить, какие столбцы отличаются.

SELECT *
    , CASE 
        WHEN a.OperationType <> b.OperationType
        THEN 1
        ELSE 0
        END AS OperationTypeDiffers
    , CASE
        WHEN a.OperationDate <> b.OperationDate
        THEN 1
        ELSE 0
        END AS OperationDateDiffers
FROM xUsers a
JOIN xUsers b
    ON a.xUserID < b.xUserID
    AND a.UserID = b.UserID
    AND (a.OperationType <> b.OperationType
        OR a.OperationDate <> b.OperationDate) -- etc.
WHERE a.UserID = @UserID
0 голосов
/ 04 января 2012

Вы можете поместить строки xUsers во временную таблицу, а затем сделать цикл времени для каждого из них и сравнить результаты.

OR

Вы можете создать динамический SQL и использовать таблицы sysobjects и syscolumns для сравнения каждого результата. Это будет более динамически , и тогда это будет легко реализовать для других таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...