|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Подскажите, плиз, что я делаю не так? :( ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 13:30 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 22:29 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
что-то типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 22:46 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SQL2008, почему же заморочки? А если в результате переименования будет 4 одинаковых строки? Да и с Вашим подходом сначала удалить, а потом, если нет добавить как-то не шустро будет работать с таблицей в более четверти миллиарда строк... ИМХО. Да и этот вопрос уже решен. Я уже заменил значения в 300 млн строк по двум полям. Я уже благодарил человека за неоценимо оказанную помощь. Сейчас мне нужно сделать так, чтобы убрать различные символы, которые попали в названия (пробел, дефис, скобки и т.д.), но чтобы не возникало матюка по поводу дубликата ключа. Если в решении мы знали что и на что меняем, то здесь не совсем. Я еще раз напомню, я специалист не по SQL. Именно поэтому решил обратиться в этом форуме к более знающим по этой теме людям... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 22:52 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik А если в результате переименования будет 4 одинаковых строки? Как это так может получиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 22:55 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Да и с Вашим подходом сначала удалить, а потом, если нет добавить как-то не шустро будет работать с таблицей в более четверти миллиарда строк... ИМХО. А LEFT JOIN по 4 полям без WHERE прямо взлетит? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 23:01 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SQL2008, ниже может встретиться такая же строка... О чем мы говорим, уже решено. Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный. Может ошибаюсь, может в SQL это принято. А так получается, что проходя каждую строку Вы ее сначала удаляете, а потом еще и ищете. Это разве не иррациональное решение? А я спрашиваю по поводу уже другой задачи... Как удалить определенные символы, прекрасно удаляется (для моего случая) предложенный выше мне хорошим человеком вариант: Код: sql 1.
Вот я и хочу использовать для решения своей уже второй задачи... Но не знаю как. :( З.Ы. Да, по поводу нескольких строк я не прав. Соглашусь. Но суть не в этом. Я не хочу спорить, прекрасно осознавая, что не силен в SQL (иначе не обратился бы сюда). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 23:04 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik SQL2008, ниже может встретиться такая же строка... О чем мы говорим, уже решено. Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный. Может ошибаюсь, может в SQL это принято. А так получается, что проходя каждую строку Вы ее сначала удаляете, а потом еще и ищете. Это разве не иррациональное решение? А я спрашиваю по поводу уже другой задачи... Как удалить определенные символы, прекрасно удаляется (для моего случая) предложенный выше мне хорошим человеком вариант: Код: sql 1.
Вот я и хочу использовать для решения своей уже второй задачи... Но не знаю как. :( З.Ы. Да, по поводу нескольких строк я не прав. Соглашусь. Но суть не в этом. Я не хочу спорить, прекрасно осознавая, что не силен в SQL (иначе не обратился бы сюда). Можно просто сначала удалить, а потом попытаться вставить - ключ просто не даст вставить, если такая же запись уже есть. Надо будет только ошибку нарушения constraint при этом обработать ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2020, 23:39 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
fkthat Можно просто сначала удалить, а потом попытаться вставить - ключ просто не даст вставить, если такая же запись уже есть. Надо будет только ошибку нарушения constraint при этом обработать Я просто не знаю как здесь обрабатываются ошибки исключением, чтобы выполнение потом продолжилось. Пробовал использовать try - catch, но у меня при ошибке попадает в исключение, выдается ошибка и процесс останавливается. В иных системах есть обработка исключений с возможностью продолжить код программы. Здесь я не знаю как это сделать и можно ли. Я вообще думал, что опять можно применить Merge, мне эта конструкция нравится, но я не достаточно хорошо ее изучил. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 00:22 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Сам подход сначала удалять, а потом искать и сравнивать, ИМХО, не совсем правильный. Правильный тот метод который работает быстро и без ошибок. Все остальное софистика. Если ваш способ вас устраивает, то используйте его. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 09:49 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Здесь я не знаю как это сделать и можно ли. Закоммитить ошибочную транзакцию не получится никоим образом! Поэтому постарайтесь избегать исключений. SerPaNikможно применить Merge, мне эта конструкция нравится, но я не достаточно хорошо ее изучил. :) Я бы вам посоветовал потратить немного времени, изучить и использовать именно штатные функции SQL. Если вы работает с большими объемами, то именно их, оптимизированных на уровне движка, следует использовать для улучшение быстродействия. Прошу извинить за банальные истины. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 09:57 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Подскажите, плиз, что я делаю не так? :( 1. SerPaNik Код: sql 1.
2. Запросом в CTE вы просто соединили таблицу саму с собой. Что дальше с этим собираетесь делать? 3. Очищать данные нужно ранее в CTE, а не в using ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 11:57 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm Выделенное это по-вашему что? 2. Запросом в CTE вы просто соединили таблицу саму с собой. Что дальше с этим собираетесь делать? 3. Очищать данные нужно ранее в CTE, а не в using Пока только создал запрос, чтобы во втором столбце было Нулл, если необходимо изменение. Код: sql 1. 2. 3. 4.
Но правильным ли я путем иду, не знаю. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 14:54 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, Вы лучше напишите какие столбцы нужно очистить от мусора и что потом удалять. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 16:07 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm SerPaNik, Вы лучше напишите какие столбцы нужно очистить от мусора и что потом удалять. Сама конструкция Код: sql 1.
удаляет ненужные символы. Как связать Ваш вариант с этой конструкцией я пока не могу понять. Может и другое решение есть, но я тоже его не знаю. З.Ы. В Вашем варианте я хотел использовать еще один параметр, например, @Pole, чтобы в нем имя поля хранилось Код: sql 1.
, но не нашел как подставить значение из этого параметра, например, в строку b.article = a.article b.@Pole=a.@Pole не прокатывает. :) Но это так, я уже хотел сделать более универсальный код... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 18:15 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, Так чего с дублями-то делать, если нашли? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 19:55 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm SerPaNik, Так чего с дублями-то делать, если нашли? Удалять. Как и в Вашем решении. Именно с дублями и проблема. Так бы можно было UpDate использовать. А ключ, напомню, по всем четырем полям. Исходные данные не изменились, а вот задача изменилась. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 20:15 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, Как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 22:12 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm SerPaNik, Как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Что-то не воспринимает второй when matched почему-то... я так понимаю Ошибка: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 22:29 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Код: sql 1. 2. 3. 4. 5. 6. 7.
а так ? Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2020, 23:50 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik Что-то не воспринимает второй when matched почему-то... я так понимаю Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 09:26 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
invm SerPaNik Что-то не воспринимает второй when matched почему-то... я так понимаю Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Код: sql 1. 2.
Я отдельно выполнил селект, чтобы получить таблицу Т. Почему-то для этого кода rn = 1 для всех трех записей. Матюк идет на этот артикул. Есть еще поле a_article, которое потом тоже надо будет очистить от спецсимволов. Может поэтому так получается... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 13:44 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
Обнаружил, что в таблице Т есть только одна запись с артикулом 8521468020, в таблице есть две записи, одна уже с таким артикулом, а вторая будет с ним после удаления знаков... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 14:33 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SerPaNik, Думаете интересно гадать что за запрос и на каких данных вы выполняете? Давайте скрипт создания таблицы и заполнения ее данными. И выполняемый запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 16:09 |
|
Составной ключ по всем полям. При Update, если будет дубль, то удалить исходную строку
|
|||
---|---|---|---|
#18+
SQL2008 SerPaNik Здесь я не знаю как это сделать и можно ли. Закоммитить ошибочную транзакцию не получится никоим образом! Поэтому постарайтесь избегать исключений. Можно использовать IGNORE_DUP_KEY - тогда попытка вставки с нарушением ключа будет просто проигнорирована. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 17:07 |
|
|
start [/forum/topic.php?fid=46&msg=40021118&tid=1685377]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 451ms |
0 / 0 |