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

Откуда:
Сообщений: 38
Есть база от 1С 8.2 .
Создал ХП которая ищет значение во всех таблицах и всех столбцах определённого типа и заменяет на другое (binary(16)). Процедура отрабатывает отлично за исключением некоторых ньюансов. Есть таблицы с кластерным индексом и при попытке замены возникает дублирующая запись.

Вопрос: как лучше доработать ХП, чтобы при попытке замены в такой ситуации просто удалялась эта запись? (вопрос в определении момента возникновения дублирующей записи)

Заранее благодарю.
26 сен 12, 11:47    [13224033]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Доработать ХП, что бы она просто удаляла дублирующие записи.
Согласно принципам и логике построения это процедуры.
26 сен 12, 12:39    [13224522]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Valentine
Member

Откуда:
Сообщений: 38
Приведу пример. У меня есть таблица
1510

2510

3711

2610



Надо все двойки заменить на единицы. Но записи должны быть уникальны. Если я просто заменю все 2, но у меня возникает дублирование записе (1 и 2 строки), а мне надо просто в таком случае найти вторую строку и удалить и получить :
1510

3711

1610


З.Ы В какой колонке находятся двойки заранее неизвестно- искать приходиться по всем.
26 сен 12, 13:06    [13224794]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Ну и? Что мешает удалить получающиеся дубли?
26 сен 12, 13:16    [13224942]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
1й1
Guest
Valentine,

группировку по всем столбцам сделай и если количество больше 1, значит это и есть дубли.
26 сен 12, 13:32    [13225121]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Valentine
Надо все двойки заменить на единицы. Но записи должны быть уникальны. Если я просто заменю все 2, но у меня возникает дублирование записе (1 и 2 строки), а мне надо просто в таком случае найти вторую строку и удалить и получить :

На колонках уникальный индекс?
Если нет, то делаете замену, после чего удаляете дубли.
Если да - при замене делаете try ... catch, и в обработчике исключений удаляете строки, которые при замене стали бы дублями и повторяете операцию замены.
26 сен 12, 14:25    [13225709]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Minamoto
Valentine
Надо все двойки заменить на единицы. Но записи должны быть уникальны. Если я просто заменю все 2, но у меня возникает дублирование записе (1 и 2 строки), а мне надо просто в таком случае найти вторую строку и удалить и получить :

На колонках уникальный индекс?
Если нет, то делаете замену, после чего удаляете дубли.
Если да - при замене делаете try ... catch, и в обработчике исключений удаляете строки, которые при замене стали бы дублями и повторяете операцию замены.
Зачем апдейтить записи, которые тут же всё равно удалять придётся?
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN F1 IN(1,2) THEN 1 ELSE F1 END,F2,F3 ORDER BY (SELECT 0)) FROM T)
DELETE CTE WHERE N>1;

UPDATE T SET F1=1 WHERE F1=2;
26 сен 12, 14:37    [13225816]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Valentine
Member

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

спасибо!
Должно заработать
26 сен 12, 15:36    [13226487]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Valentine
Member

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

я не сильно разбираюсь, но уточню - искать единицу надо во всех колонках
26 сен 12, 15:38    [13226506]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Valentine
iap,

я не сильно разбираюсь, но уточню - искать единицу надо во всех колонках
Какие мелочи!
WITH CTE(N) AS(SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN F1 IN(1,2) THEN 1 ELSE F1 END, CASE WHEN F2 IN(1,2) THEN 1 ELSE F2 END, CASE WHEN F3 IN(1,2) THEN 1 ELSE F3 END ORDER BY (SELECT 0)) FROM T)
DELETE CTE WHERE N>1;

UPDATE T SET
 F1=CASE F1 WHEN 2 THEN 1 ELSE F1 END
,F2=CASE F2 WHEN 2 THEN 1 ELSE F2 END
,F3=CASE F3 WHEN 2 THEN 1 ELSE F3 END
WHERE 2 IN(F1,F2,F3);
26 сен 12, 15:56    [13226661]     Ответить | Цитировать Сообщить модератору
 Re: Доработка замены  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
iap, говорить бессмысленно. Ничего поменять нельзя, если гуманитарий, то всегда возмётся самый хреновый вариант.

Принцип наименьшего сопротивления на то и принцип, работает железно.
Следовательно, подобное притягивает подобное.
26 сен 12, 22:48    [13228795]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить