Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Есть таблица на 250 полей. В ней записи хранятся попарно. Такая себе таблица истории, первая запись - поля до измененния, вторая запись - поля после изменения.
Необходимо сравнить все поля первой записи со всеми полями второй записи и найти только те, которые отличаются.
Как это реально реализовать?
25 май 12, 14:39    [12615566]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
первая запись - поля до измененния, вторая запись - поля после изменения.

А "первая" и "вторая" - это вот прямо цифры 1 и 2 в каком то поле ?
25 май 12, 15:00    [12615768]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, какой-то признак чтобы отобрать две записи можно придумать, допустим что у нас уже есть две записи, в которой есть признак строки "до изменения" и "после изменения" + id каждой записи + время изменения + все остальные поля.
25 май 12, 15:10    [12615866]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Glory, какой-то признак чтобы отобрать две записи можно придумать,

Ну так придумайте и используйте его в JOIN
25 май 12, 15:14    [12615917]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, как с помощью JOIN отобрать все поля второй записи, которые отличаются от полей первой записи? Именно те поля, которые отличаются, из 250 доступных.
25 май 12, 15:19    [12615956]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Glory, как с помощью JOIN отобрать все поля второй записи,

Это вы делать не с помощью JOIN, а с помощью сравнения полей в тексте запроса
Через CASE, например
25 май 12, 15:22    [12615989]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Через CASE?
Glory, Расскажите, как можно обратиться в T-SQL ко всем полям (не перечисляя все 250 полей) для проведения каких-то действий в цикле? Например, для сравнения их в цикле.
У меня есть идея транспонировать матрицу(таблицу), чтобы пройтись по всем полям циклом используя названия полей из INFORMATION_SCHEMA.COLUMNS. Но может есть какой-то более цивильный вариант?
25 май 12, 15:30    [12616082]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
_Наталья
Через CASE?
Glory, Расскажите, как можно обратиться в T-SQL ко всем полям (не перечисляя все 250 полей) для проведения каких-то действий в цикле? Например, для сравнения их в цикле.
У меня есть идея транспонировать матрицу(таблицу), чтобы пройтись по всем полям циклом используя названия полей из INFORMATION_SCHEMA.COLUMNS. Но может есть какой-то более цивильный вариант?

Динамическим sql выполнить запрос из заранее сформированной строки.
25 май 12, 15:34    [12616119]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Мистер Хенки
Динамическим sql выполнить запрос из заранее сформированной строки.

О какой заранее сформированной строке идет речь?

Я уже не уверена что мы говорим об одном и том же.
У меня две записи по 250 полей.
И мне надо сравнить каждое поле первой записи с каждым полем второй записи и выбрать только те поля обоих записей, которые были измнены.
25 май 12, 15:42    [12616192]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
_Наталья,
в цикле по всем нужным вам названиям колонок сформировать запрос в виде строки и потом выполнить его sp_executesql .
25 май 12, 15:47    [12616246]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
_Наталья
Мистер Хенки
Динамическим sql выполнить запрос из заранее сформированной строки.

О какой заранее сформированной строке идет речь?

Я уже не уверена что мы говорим об одном и том же.
У меня две записи по 250 полей.
И мне надо сравнить каждое поле первой записи с каждым полем второй записи и выбрать только те поля обоих записей, которые были измнены.


непонятно таки вам колонки надо вывести с непохожими данными или строки с непохожими данными в колонках??
25 май 12, 15:49    [12616261]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Мистер Хенки, как ни странно, но я знаю что такое динамический запрос и как работает exec и sp_executesql.

Но вопрос остался преждним - как мне передать в запрос все поля, не перечисляя их? Может можно обращаться по цифровому индексу поля? Как вытянуть все поля, чтобы не делать запрос в INFORMATION_SCHEMA.COLUMNS?
25 май 12, 15:53    [12616322]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
WarAnt
непонятно таки вам колонки надо вывести с непохожими данными или строки с непохожими данными в колонках??

Колонки с отличающимися данными из имеющихся двух строк.
25 май 12, 15:55    [12616333]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Но вопрос остался преждним - как мне передать в запрос все поля, не перечисляя их?

Никак
25 май 12, 15:55    [12616340]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
PVC
Member

Откуда:
Сообщений: 319
Glory,

А если UNPIVOT/сравнение/PIVOT?
25 май 12, 16:03    [12616432]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
PVC
А если UNPIVOT/сравнение/PIVOT?

И что вы передадите в UNPIVOT ? Номера полей ? Или * ?
25 май 12, 16:06    [12616453]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
PVC
Member

Откуда:
Сообщений: 319
Glory,

я бы сфоримровал список динамически.
25 май 12, 16:06    [12616459]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
PVC
я бы сфоримровал список динамически.

ТС
"но я знаю что такое динамический запрос и как работает exec и sp_executesql.
Но вопрос остался преждним - как мне передать в запрос все поля, не перечисляя их?"
25 май 12, 16:08    [12616480]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Я не уверена что мы говорим об одном и том же:

DECLARE 
@I  INT = 1,
@fI INT = (SELECT MAX(ORDINAL_POSITION)
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = N'HistoryContr'),
@field nVARCHAR(255),
@query VARCHAR(max)
            

WHILE @I <= @fI
    BEGIN    
        SET @field = (SELECT COLUMN_NAME
                       FROM INFORMATION_SCHEMA.COLUMNS
                      WHERE TABLE_NAME = N'HistoryContr' and ORDINAL_POSITION = @I)
        
        SET @query = 'SELECT ' + @field + ' FROM HistoryContr WHERE id in (1, 2)'
        
        EXEC (@query)
        
        SET @I = @I + 1
    END;

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

Но я спрашивала можно ли как-то по другому передать названия полей? Но пока я пыталась вас понять, реализовала так :(
25 май 12, 16:15    [12616530]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
Дальше уже можно написать сравнивалку и записывать отличающиеся, например, во временню таблицу.

А что сразу то не написать в SET @query нужный запрос ?
А EXEC (@query) сделать после цикла
25 май 12, 16:21    [12616591]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
PVC
Member

Откуда:
Сообщений: 319
Glory,

да, что то я пропустил... пятница уже...
25 май 12, 16:21    [12616601]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, потому что как релазиовать дальше, сравнить и отобрать колонки, я знаю. Меня интересовало только как правильно передать все колонки.
25 май 12, 16:23    [12616612]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
_Наталья
потому что как релазиовать дальше, сравнить и отобрать колонки, я знаю. Меня интересовало только как правильно передать все колонки.

Мда.
Вместо 1 запроса написать 250 это просто ... прелестно
25 май 12, 16:25    [12616628]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Не написать - выполнить
25 май 12, 16:26    [12616634]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить все поля записи со всеми полями другой записи?  [new]
_Наталья
Member

Откуда:
Сообщений: 26
Glory, Ваша правда, exec @query будет не там. Спасибо.
25 май 12, 16:27    [12616655]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить