powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
25 сообщений из 60, страница 2 из 3
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020990
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, плиз, что я делаю не так? :(
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021035
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
fkthat
Я вообще что-то не вкурил. Если ключ по всем полям (допустим их два) и у меня есть запись {"foo", "bar"}, то нужно при добавлении записи {"foo", "bar"} ту запись {"foo", "bar"}, которая уже есть удалить, что ли? Смысл какой?

Смысл в изменении . Если есть записи:
brandarticlea_branda_articleMITSUBISHI125MITSUBISHIMD312639BOSCH0 092 S40 260BOSCH0092S40260BOSCH0 092 S40 260VARTA5704120633132BOSCH0 242 129 515CHAMPIONOE201/T10BOSCH125MITSUBISHIMD312639

И я хочу изменить значения в поле brand с MITSUBISHI на BOSCH, то возникнет ошибка. Ибо изменяемая первая строка будет после изменения идентична последней. В таком случае я хотел, чтобы первая строка была просто удалена ибо результат изменения уже есть в базе...
Как-то так.

Не пойму я ваших заморочек!
Почему просто перед апдейтом не попытаться удалить строку, которую пытаетесь переделать?
В вашем случае все равно её больше не будет в базе. Так?

Потом проверить, а есть-ли уже новая строка в таблице. Если есть, то ничего не делать, если нет, то добавить.
В вашем случае это
Удаляем
brandarticlea_branda_articleMITSUBISHI125MITSUBISHIMD312639

И смотрим наличие
brandarticlea_branda_articleBOSCH125MITSUBISHIMD312639
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021037
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
delete from [your_table]
where <old row conditions>

using [your_table] s
merge [your_table] t
on (s.xxx = t.xxx and .......)
when not matсhed
insert values (<new row values>) 
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021038
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008, почему же заморочки? А если в результате переименования будет 4 одинаковых строки? Да и с Вашим подходом сначала удалить, а потом, если нет добавить как-то не шустро будет работать с таблицей в более четверти миллиарда строк... ИМХО.
Да и этот вопрос уже решен. Я уже заменил значения в 300 млн строк по двум полям. Я уже благодарил человека за неоценимо оказанную помощь.
Сейчас мне нужно сделать так, чтобы убрать различные символы, которые попали в названия (пробел, дефис, скобки и т.д.), но чтобы не возникало матюка по поводу дубликата ключа. Если в решении мы знали что и на что меняем, то здесь не совсем.
Я еще раз напомню, я специалист не по SQL. Именно поэтому решил обратиться в этом форуме к более знающим по этой теме людям...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021039
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
А если в результате переименования будет 4 одинаковых строки?

Как это так может получиться?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021041
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Да и с Вашим подходом сначала удалить, а потом, если нет добавить как-то не шустро будет работать с таблицей в более четверти миллиарда строк... ИМХО.

А LEFT JOIN по 4 полям без WHERE прямо взлетит?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021042
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008, ниже может встретиться такая же строка...
О чем мы говорим, уже решено. Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный. Может ошибаюсь, может в SQL это принято. А так получается, что проходя каждую строку Вы ее сначала удаляете, а потом еще и ищете. Это разве не иррациональное решение?
А я спрашиваю по поводу уже другой задачи... Как удалить определенные символы, прекрасно удаляется (для моего случая) предложенный выше мне хорошим человеком вариант:
Код: sql
1.
replace(translate(article,'{!''("@#-$%^&*)} ','################'),'#','')


Вот я и хочу использовать для решения своей уже второй задачи... Но не знаю как. :(
З.Ы. Да, по поводу нескольких строк я не прав. Соглашусь. Но суть не в этом. Я не хочу спорить, прекрасно осознавая, что не силен в SQL (иначе не обратился бы сюда).
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021044
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
SQL2008, ниже может встретиться такая же строка...
О чем мы говорим, уже решено. Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный. Может ошибаюсь, может в SQL это принято. А так получается, что проходя каждую строку Вы ее сначала удаляете, а потом еще и ищете. Это разве не иррациональное решение?
А я спрашиваю по поводу уже другой задачи... Как удалить определенные символы, прекрасно удаляется (для моего случая) предложенный выше мне хорошим человеком вариант:
Код: sql
1.
replace(translate(article,'{!''("@#-$%^&*)} ','################'),'#','')



Вот я и хочу использовать для решения своей уже второй задачи... Но не знаю как. :(
З.Ы. Да, по поводу нескольких строк я не прав. Соглашусь. Но суть не в этом. Я не хочу спорить, прекрасно осознавая, что не силен в SQL (иначе не обратился бы сюда).

Можно просто сначала удалить, а потом попытаться вставить - ключ просто не даст вставить, если такая же запись уже есть. Надо будет только ошибку нарушения constraint при этом обработать
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021046
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
Можно просто сначала удалить, а потом попытаться вставить - ключ просто не даст вставить, если такая же запись уже есть. Надо будет только ошибку нарушения constraint при этом обработать

Я просто не знаю как здесь обрабатываются ошибки исключением, чтобы выполнение потом продолжилось.
Пробовал использовать try - catch, но у меня при ошибке попадает в исключение, выдается ошибка и процесс останавливается. В иных системах есть обработка исключений с возможностью продолжить код программы. Здесь я не знаю как это сделать и можно ли.
Я вообще думал, что опять можно применить Merge, мне эта конструкция нравится, но я не достаточно хорошо ее изучил. :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021056
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный.

Правильный тот метод который работает быстро и без ошибок.
Все остальное софистика.
Если ваш способ вас устраивает, то используйте его.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021058
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Здесь я не знаю как это сделать и можно ли.

Закоммитить ошибочную транзакцию не получится никоим образом!
Поэтому постарайтесь избегать исключений.

SerPaNikможно применить Merge, мне эта конструкция нравится, но я не достаточно хорошо ее изучил. :)
Я бы вам посоветовал потратить немного времени, изучить и использовать именно штатные функции SQL.
Если вы работает с большими объемами, то именно их, оптимизированных на уровне движка, следует использовать для улучшение быстродействия.
Прошу извинить за банальные истины.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021068
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Подскажите, плиз, что я делаю не так? :(

1.
SerPaNik
Код: sql
1.
using (values (replace(translate(brand,'a!''"(@#-$%^&*)} ','a###############'),'#',''))) s(brand) on 1 = 1

Выделенное это по-вашему что?
2. Запросом в CTE вы просто соединили таблицу саму с собой. Что дальше с этим собираетесь делать?
3. Очищать данные нужно ранее в CTE, а не в using
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021085
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Выделенное это по-вашему что?
2. Запросом в CTE вы просто соединили таблицу саму с собой. Что дальше с этим собираетесь делать?
3. Очищать данные нужно ранее в CTE, а не в using

Пока только создал запрос, чтобы во втором столбце было Нулл, если необходимо изменение.
Код: sql
1.
2.
3.
4.
select a.article, b.article as brand__new from
  PartnerAnalogs_test a left join PartnerAnalogs_test b on 
  a.article = replace(translate(a.article,'{!''"(@#-$%^&*)} ','################'),'#','')  and b.a_brand = a.a_brand 
  and b.brand = a.brand and b.a_article = a.a_article

Но правильным ли я путем иду, не знаю. :(
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021093
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

Вы лучше напишите какие столбцы нужно очистить от мусора и что потом удалять.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021118
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
SerPaNik,
Вы лучше напишите какие столбцы нужно очистить от мусора и что потом удалять.
Если вкратце, то нужно очистить столбец article, но с учетом того, чтобы не возникала ошибка дублей ключа (который по всем 4 полям). Ваше решение мне помогло для замены в столбце значения на значение, но тогда мы знали что и на что меняется, а здесь нужно удалить определенные символы (например, кавычки, подчеркивания, скобки, дефисы, пробел и т.д.) из всех строк в этом поле.
Сама конструкция
Код: sql
1.
replace(translate(article,'{_!''"(@#-$%^&*)} ','#################'),'#','')

удаляет ненужные символы. Как связать Ваш вариант с этой конструкцией я пока не могу понять. Может и другое решение есть, но я тоже его не знаю.

З.Ы. В Вашем варианте я хотел использовать еще один параметр, например, @Pole, чтобы в нем имя поля хранилось
Код: sql
1.
SET @Pole = 'article'

, но не нашел как подставить значение из этого параметра, например, в строку
b.article = a.article b.@Pole=a.@Pole не прокатывает. :) Но это так, я уже хотел сделать более универсальный код...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021141
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

Так чего с дублями-то делать, если нашли?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021150
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
SerPaNik,
Так чего с дублями-то делать, если нашли?

Удалять. Как и в Вашем решении. Именно с дублями и проблема. Так бы можно было UpDate использовать. А ключ, напомню, по всем четырем полям. Исходные данные не изменились, а вот задача изменилась. :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021186
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

Как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as
(
 select
  b.article_new, a.article,
  row_number() over (partition by b.article_new, a.brand, a.a_article, a.a_brand order by (select 1)) as rn
 from
  PartnerAnalogs_test a cross apply
  (select replace(translate(a.article,'{!''"(@#-$%^&*)} ','################'),'#','')) b(article_new)
 where
  a.article <> b.article_new
)
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched and rn > 1
 delete;
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021194
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
SerPaNik,

Как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as
(
 select
  b.article_new, a.article,
  row_number() over (partition by b.article_new, a.brand, a.a_article, a.a_brand order by (select 1)) as rn
 from
  PartnerAnalogs_test a cross apply
  (select replace(translate(a.article,'{!''"(@#-$%^&*)} ','################'),'#','')) b(article_new)
 where
  a.article <> b.article_new
)
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched and rn > 1
 delete;


Что-то не воспринимает второй when matched почему-то... я так понимаю
Ошибка:
Код: sql
1.
2.
Msg 156, Level 15, State 1, Line 18
Incorrect syntax near the keyword 'delete'.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021201
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Код: sql
1.
2.
3.
4.
5.
6.
7.
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched and rn > 1
 delete;

а так ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched -- and rn > 1
 delete;
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021255
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Что-то не воспринимает второй when matched почему-то... я так понимаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as
(
 select
  b.article_new, a.article,
  row_number() over (partition by b.article_new, a.brand, a.a_article, a.a_brand order by (select 1)) as rn
 from
  PartnerAnalogs_test a cross apply
  (select replace(translate(a.article,'{!''"(@#-$%^&*)} ','################'),'#','')) b(article_new)
 where
  a.article <> b.article_new
)
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched and t.rn > 1 then
 delete;
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021358
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
SerPaNik
Что-то не воспринимает второй when matched почему-то... я так понимаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with t as
(
 select
  b.article_new, a.article,
  row_number() over (partition by b.article_new, a.brand, a.a_article, a.a_brand order by (select 1)) as rn
 from
  PartnerAnalogs_test a cross apply
  (select replace(translate(a.article,'{!''"(@#-$%^&*)} ','################'),'#','')) b(article_new)
 where
  a.article <> b.article_new
)
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 then
 update
  set article = t.article_new
when matched and t.rn > 1 then
 delete;

Я мог и сам догадаться, что then пропущен был. :) Создал тестовый набор для проверки и запустил, но выдало ошибку:
Код: sql
1.
2.
Msg 2627, Level 14, State 1, Line 12
Violation of PRIMARY KEY constraint 'PK_PartnerAnalogs_test'. Cannot insert duplicate key in object 'dbo.PartnerAnalogs_test'. The duplicate key value is  ...


Я отдельно выполнил селект, чтобы получить таблицу Т. Почему-то для этого кода rn = 1 для всех трех записей. Матюк идет на этот артикул.
Есть еще поле a_article, которое потом тоже надо будет очистить от спецсимволов. Может поэтому так получается...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021390
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обнаружил, что в таблице Т есть только одна запись с артикулом 8521468020, в таблице есть две записи, одна уже с таким артикулом, а вторая будет с ним после удаления знаков...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021450
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

Думаете интересно гадать что за запрос и на каких данных вы выполняете?
Давайте скрипт создания таблицы и заполнения ее данными. И выполняемый запрос.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021466
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008
SerPaNik
Здесь я не знаю как это сделать и можно ли.

Закоммитить ошибочную транзакцию не получится никоим образом!
Поэтому постарайтесь избегать исключений.

Можно использовать IGNORE_DUP_KEY - тогда попытка вставки с нарушением ключа будет просто проигнорирована.
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]