powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
60 сообщений из 60, показаны все 3 страниц
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020482
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть жирная таблица с четырьмя полями. Все они добавлены в ключ.
Скрипт создания таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[PartnerAnalogs_test](
	[brand] [nvarchar](50) NOT NULL,
	[article] [nvarchar](50) NOT NULL,
	[a_brand] [nvarchar](50) NOT NULL,
	[a_article] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_PartnerAnalogs_test] PRIMARY KEY CLUSTERED 
(
	[brand] ASC,
	[article] ASC,
	[a_brand] ASC,
	[a_article] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


Версия сервера на всякий случай
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть).

Пытаюсь пока делать обычный запрос,
Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE @Value NVARCHAR(50);
DECLARE @Zam NVARCHAR(50);
SET @Value = 'YAMATO'; -- что хотим заменить
SET @Zam = 'TOYOTA';   -- на что хотим заменить

UPDATE PartnerAnalogs_test SET PartnerAnalogs_test.brand =@Zam
WHERE PartnerAnalogs_test.brand=@Value


но, как и ожидалось, получаю ошибку:
текст ошибкиViolation of PRIMARY KEY constraint 'PK_PartnerAnalogs_test'. Cannot insert duplicate key in object 'dbo.PartnerAnalogs_test'. The duplicate key value is (TOYOTA, 43215-P0100, NISSAN, 43215-52L60).


Возможно ли вообще выполнить это задание? На первый взгляд, оно не относится уж к таким редким, ИМХО...

Пытался смотреть в сторону Merge, но в данном случае не знаю можно ли его использовать.

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

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

Обычно, если надо обновить поле, являющееся ключом, то уже что-то пошло не так или неправильно спроектировано.

Ключ на все поля - это печально. Не делайте так.

Один из вариантов решения - сгенерите времянку со старым и новым значениями. Потом проверьте "дубли" и удалите их. А оставшимся обновите. Для консистентности - в одной транзакции.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020507
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ключ на все поля - это печально. Не делайте так.
Условия уже есть, надо выполнить задачу. Ключи по всем полям, видимо, делали для уникальности значений в каждой строке...

Один из вариантов решения - сгенерите времянку со старым и новым значениями. Потом проверьте "дубли" и удалите их. А оставшимся обновите. Для консистентности - в одной транзакции.
Я извиняюсь, но, если не сложно, можно подробней. Я не силен в скульном диалекте и в SQL тоже. К сожалению, и надеюсь, что пока. :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020514
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerPaNik,

Если по-простому, то
if exists (select * from T where ...=@new)
then
delete from T where ...=@old
else
update
set ..=@new
where ...=@old

Если по сложному, то merge
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020515
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще что-то не вкурил. Если ключ по всем полям (допустим их два) и у меня есть запись {"foo", "bar"}, то нужно при добавлении записи {"foo", "bar"} ту запись {"foo", "bar"}, которая уже есть удалить, что ли? Смысл какой?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020516
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql

Если по-простому, то...
Спасибо. Попробую. Но в таблице несколько сотен миллионов записей...
Подозреваю, что будет очень долго.

Если по сложному, то merge А вот с Merge я пытался, но так у меня ничего и не получилось сделать. Думаю. что этот способ должен быть быстрее на такой жирной таблице...
Был бы рад примерам... Спасибо.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020524
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
  a.brand, b.brand as brand__new
 from
  PartnerAnalogs_test a left join
  PartnerAnalogs_test b on b.brand = @Zam and b.article = a.article and b.a_brand = a.a_brand and b.a_article = a.a_article
 where
  a.brand = @Value
)
merge into t
using (values (@Zam)) s(brand) on 1 = 1
when matched and t.brand__new is null then
 update
  set
   brand = s.brand
when matched and t.brand__new is not null then
 delete;
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020527
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть).
Похоже, что нужно просто ничего не делать в этом случае, ведь сами же пишете, что такая запись уже есть в вашей таблице и дублей быть не должно.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020529
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
Я вообще что-то не вкурил. Если ключ по всем полям (допустим их два) и у меня есть запись {"foo", "bar"}, то нужно при добавлении записи {"foo", "bar"} ту запись {"foo", "bar"}, которая уже есть удалить, что ли? Смысл какой?

Смысл в изменении . Если есть записи:
brandarticlea_branda_articleMITSUBISHI125MITSUBISHIMD312639BOSCH0 092 S40 260BOSCH0092S40260BOSCH0 092 S40 260VARTA5704120633132BOSCH0 242 129 515CHAMPIONOE201/T10BOSCH125MITSUBISHIMD312639
И я хочу изменить значения в поле brand с MITSUBISHI на BOSCH, то возникнет ошибка. Ибо изменяемая первая строка будет после изменения идентична последней. В таком случае я хотел, чтобы первая строка была просто удалена ибо результат изменения уже есть в базе...
Как-то так.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020531
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulYoung
SerPaNik
Необходимо изменить значение в одном из полей . При этом, если при изменении подразумевается дублирование , то эту строку , в которой пытаемся изменить, нужно удалить (ведь подразумеваемый набор значений во всех полях уже есть).
Похоже, что нужно просто ничего не делать в этом случае, ведь сами же пишете, что такая запись уже есть в вашей таблице и дублей быть не должно.

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

Не запись есть, а такое сочетание значения полей. Но мы же в другой строке меняем, вот ее и удалить...
Если мы меняем в другой строке и результат изменения не валиден, об этом нужно сообщить клиенту и ничего не удалять. А так у вас какая-то странная логика получается.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020542
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо добавить нормальное уникальное поле, сделать его первичным ключом, в триггере AFTER UPDATE удалить записи с задублированными полями с не минимальным первичным ключом.
Ведь я могу проапдейтить зараз 100500 записей, после чего получится сто тыщ записей с одинаковыми значениями.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020547
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Не запись есть, а такое сочетание значения полей. Но мы же в другой строке меняем, вот ее и удалить... Ключи ведь по всем полям...
Ответов не читаем?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020551
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Ответов не читаем?

Конечно читаем. Я просто пока отвечаю на одно, не вижу, что пришел ответ. Ваш проверяю и пытаюсь понять смысл, чтобы разобраться. С учетом моих скудных знаний. :) В любом случае спасибо...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020555
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulYoung, Логика в том, что криво добавили записи из CSV. Поэтому приходиться подчищать. Но это в моем случае.
И в чем плоха логика и изменить на нужные значения поля в строке и при этом избежать дублирования (т.е. ошибок в моем случае с ключами по всем полям)?
При изменении значения, если дубля не предполагается, то изменить, а если дубль после изменения предполагается, то удалить изменяемую, потому что аналогичная уже есть. Вроде логика нормальная...
З.Ы. Это таблица аналогов запчастей. т.е. производитель, артикул, производитель аналога, и артикул аналога. Может эта информация поможет понять, почему я так думал сделать...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020558
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

у вас в CSV "сырые" данные? а каталог запчастей нормализован и хранится отдельно?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020564
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulYoung, я пытаюсь помочь исправить ситуацию на данный момент. В csv прислали данные, которые нужно было загрузить. Корректность их никто не проверял. Так и загрузили. Теперь нужно исправить ситуацию. Но эта инфа ведь не относится к сабжу.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020568
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Большущее Вам спасибо!
Проверил. То, что нужно!
З.Ы. Тут нет системы плюсиков насколько я понял. Так бы с огромным удовольствием "влепил" бы за помощь! :)
Еще раз спасибо!
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020753
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не хочу создавать новую тему, но как в моем случае очистить все значения в поле от различных символов? Например, -()*;'@ и т.д.
Операция изменения проходит нормально, спасибо еще раз. А вот какой запустить скрипт, чтобы очистил от этих спецсимволов и пробелов все значения в определенном поле например?
Хорошо бы, если бы множество этих символов можно было задать. Напоминаю, в моем случае составной ключ по всем полям и опять же надо избежать ошибки дублирования...
Забыл сказать спасибо так же godsql за код. Спасибо.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020779
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

К сожалению, нормальный translate в sql server не завезли, но можно так.
Код: sql
1.
select replace(translate('G)))@@%&$ood','a!@#$%^&*()','a##########'),'#','') s 
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020798
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример.
#T - таблица со строками, @CharsForErase - строка с символами, которые надо удалить из всех строк.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
IF OBJECT_ID(N'tempdb..#T') IS NOT NULL DROP TABLE #T;
GO
CREATE TABLE #T(ID INT NOT NULL IDENTITY, S VARCHAR(100));
INSERT #T(S) VALUES('abcd  @bv453\\'),('xyz@#%^&dfs 54jkhgb'),('павыпа4321!"№(*:%;№');

DECLARE @CharsForErase VARCHAR(100)='# @^';

SELECT ID,
(
 SELECT C FROM
 (
  SELECT TTT.ID,V.number,C=SUBSTRING(TTT.S,V.number,1)
  FROM #T TTT
  JOIN master.dbo.spt_values V ON V.number BETWEEN 1 AND LEN(TTT.S)AND V.type='P'
  WHERE TTT.ID=T.ID
 ) TT
 WHERE @CharsForErase NOT LIKE '%'+TT.C+'%'
 ORDER BY TT.number
 FOR XML PATH(''),TYPE
).value('.','VARCHAR(100)') S
FROM #T T
ORDER BY ID;

Вместо master.dbo.spt_values годится любой источник достаточного количества целых чисел.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020841
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env, спасибо. попробую проверить :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020842
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap, спасибо, вот тут нужно будет мне больше времени, чтобы понять. А еще как сделать так, чтобы и ошибок на ключ не возникало :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020861
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env, Хорошо чистит, еще раз спасибо. :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40020868
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь срастить запрос изменения с обходом ошибки ключа со строкой удаления спецсимоволов.
Код: sql
1.
2.
3.
4.
5.
6.
7.
with t as (select a.brand, b.brand as brand__new from PartnerAnalogs_test a left join PartnerAnalogs_test b on b.brand = a.brand and b.article = a.article and b.a_brand = a.a_brand and b.a_article = a.a_article)
 --where  a.brand = @Value)
merge into t
using (values (replace(translate(brand,'a!''"(@#-$%^&*)} ','a###############'),'#',''))) s(brand) on 1 = 1
when matched and t.brand__new is null then
 update set brand = s.brand
when matched and t.brand__new is not null then delete;


Синтаксис вроде правильный, но выскакивает ошибка при выполнении: "Invalid column name 'brand'"
З.Ы. Напомню. С SQL пока разговариваю на жестах...
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При 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
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021475
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
SerPaNik, Давайте скрипт создания таблицы и заполнения ее данными. И выполняемый запрос.

Скрипт создания таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
/****** Object:  Table [dbo].[PartnerAnalogs_test]    Script Date: 23.11.2020 15:56:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[PartnerAnalogs_test](
	[brand] [nvarchar](50) NOT NULL,
	[article] [nvarchar](50) NOT NULL,
	[a_brand] [nvarchar](50) NOT NULL,
	[a_article] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_PartnerAnalogs_test] PRIMARY KEY CLUSTERED 
(
	[brand] ASC,
	[article] ASC,
	[a_brand] ASC,
	[a_article] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO



Скрипт для заполнения таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
USE [Analogs]
GO
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'1 1 1 1-1   1    1', N'LPR', N'09700')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'1-1{1}1-1''1-1', N'LPR', N'09700')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'111111', N'LPR', N'09700')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C** 0 '' 0@0"0 -9 }A )(B&E', N'General Motors', N'96394977')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C0)00*09A-BE', N'FERODO', N'FSB695')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00009ABE', N'JAPAN CARS', N'C00009JC')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00009ABE', N'LPR', N'LPR09700')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00009ABE', N'MANDO', N'MLD08')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00009ABE', N'PMC', N'PLC-008')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00009ABE', N'SANGSIN', N'SA103')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00313ABE', N'JAPAN CARS', N'C00313')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ABE', N'C00313ABE', N'KOREASTAR', N'KBSK-003')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'55501-JD00A', N'NISSAN', N'55044JG00A')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'55501-JD00A', N'NISSAN', N'55044JG00B')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'55501-JD00A', N'NISSAN', N'55501-JD000')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85214-33180', N'TOYOTA', N'85214-33180')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85214-53090', N'TOYOTA', N'85214-53090')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'8521468020', N'TOYOTA', N'85214-52110')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'8521468020', N'TOYOTA', N'85214-68020')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85214-68020', N'TOYOTA', N'85214-68020')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85220-32290', N'TOYOTA', N'85220-32290')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85222-0C021', N'TOYOTA', N'85222-0C030')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85222-0K020', N'TOYOTA', N'85222-0K020')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85222-48040', N'TOYOTA', N'85222-48040')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85223-8H300', N'NISSAN', N'85223-8H300')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'TOYOTA', N'85224-51U00', N'NISSAN', N'85224-51U00')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'НАША СИЛА', N'FL5362', N'ROCKET', N'MD3')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'НАША СИЛА', N'R6 Наша Сила', N'ROCKET', N'R6 ROCKET')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ТОВ "Форма Партс"', N'FP 6408900', N'ТОВ "Форма Партс"', N'FP 6408900')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ЦИАКРИЛАН', N'клей', N'ЦИАКРИЛАН', N'клей гель')
INSERT [dbo].[PartnerAnalogs_test] ([brand], [article], [a_brand], [a_article]) VALUES (N'ЦИАКРИЛАН', N'клей гель', N'ЦИАКРИЛАН', N'клей')


Скрипт, который запускаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
 -- и посмотрим результаты
 OUTPUT $action AS [Операция], 
                   Inserted.article AS articleNEW,
                   Deleted.article AS articleOLD;


Спасибо, что мучитесь с нубом в SQL :-)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021482
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
Спасибо, что мучитесь с нубом в SQL :-)

Кто никогда не был нубом пусть первый перечислит мне 100 рублей на карту.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021490
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008
пусть первый перечислит мне 100 рублей на карту

А constraint как реализован, который будет отбивать начисления начиная со второго?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021491
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008
Кто никогда не был нубом пусть первый перечислит мне 100 рублей на карту.
У меня алиби. :)
Просто здесь, полагаю, люди, которые изучают этот вопрос. Мне же в данный момент нужно решить две задачи. Обращаться я уже буду по ADO к серваку и выполнять эти задачи из другой программы, если нужно, конечно, будет. А так в Студио запустил скрипт, почистил, изменил что надо и бд готова к дальнейшей работе. Не факт, что я в ближайшем будущем обращусь сюда за помощью после решения этих двух задач. Поэтому и понимаю людей, которые помогают такому как я. За что и благодарен. Как-то так.
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021498
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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)
)
merge into t
using (values (1)) s(dummy) on 1 = 1
when matched and t.rn = 1 and t.article <> t.article_new then
 update
  set article = t.article_new
when matched and t.rn > 1 then
 delete
 -- и посмотрим результаты
 OUTPUT $action AS [Операция], 
                   Inserted.article AS articleNEW,
                   Deleted.article AS articleOLD;
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021508
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, еще раз огромное спасибо! . Вроде делает то, что надо :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021511
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
появилась мысль, но не знаю можно ли тут так.
Если объявить переменную
Код: sql
1.
2.
DECLARE @Pole NVARCHAR(50);
SET @Pole = 'a_article';



Можно ли потом как-то вставить её значение в строку, к примеру:
Код: sql
1.
select  b.article_new, a.@Pole

чтобы получилось типа
Код: sql
1.
select  b.article_new, a.a_article


Или здесь так нельзя?
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021901
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerPaNik, видимо, нельзя :)
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021902
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerPaNik
SerPaNik, видимо, нельзя :)
оно-то можно, через динамический запрос
("склеить" строку запроса в строковую переменную, да и выполнить через exec(@sql) )
но не нужно )
...
Рейтинг: 0 / 0
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
    #40021904
SerPaNik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, на "нет" и суда нет. ))
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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