2015-09-10 3 views
0

Я собираюсь применить уникальное ограничение 3-столбца (B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID) для моего db. Значения «none» для B_EXT_ID не влияют. Прежде чем это сделать, мне нужно обновить строки B_EXT_ID, чтобы удалить нарушителей (добавьте row_id или что-то в этом роде).Запрос на обновление дубликатов нескольких столбцов

Я знаю, как их найти:

SELECT B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID, COUNT(*) 
FROM SB_BATCH 
WHERE B_EXT_ID != 'none' 
GROUP BY B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID 
HAVING COUNT(B_EXT_ID) > 1; 

который печатает:

B_ACCT_UID B_EXT_ID                               B_CAMPAIGN_GUID      COUNT(*) 
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ ---------- 
3000000010 sto                                setna           2 
3000000010 jeden                               pierwsza          2 
3000000010 dziewiec                               14F8CDEDACE0005C98727464800000000000   3 

Перед попыткой обновления я выполнивший выберите запрос, который получил бы заменить обновлением.

SELECT B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID 
FROM SB_BATCH 
WHERE B_EXT_ID IN (SELECT B_EXT_ID FROM SB_BATCH WHERE B_EXT_ID != 'none' 
GROUP BY B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID 
HAVING COUNT(B_EXT_ID) > 1); 

И получил:

B_ACCT_UID B_EXT_ID                               B_CAMPAIGN_GUID      
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ 
3000000010 sto                                14F8CDEDACE0005C98727464800000000000 
3000000010 sto                                setna         
3000000010 sto                                setna         
3000000010 jeden                               pierwsza        
3000000010 jeden                               pierwsza        
3000000010 jeden                               14F8CDEDACE0005C98727464800000000000 
3000000010 dziewiec                               14F8CDEDACE0005C98727464800000000000 
3000000010 dziewiec                               14F8CDEDACE0005C98727464800000000000 
3000000010 dziewiec                               14F8CDEDACE0005C98727464800000000000 

Это половина работает пример, потому что он также будет обновлять не-преступников, как

B_ACCT_UID B_EXT_ID                               B_CAMPAIGN_GUID      
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ 
3000000010 sto                                14F8CDEDACE0005C98727464800000000000 

Можете ли вы помочь мне изменить запрос?

+0

Какая СУБД вы используете? Oracle, Mysql? – Crazy2crack

+0

Это Oracle, версия 11. –

+0

Теперь, что вы хотите сделать? Вы хотите удалить дубликаты? или Обновить одну из повторяющихся строк? Если да, то какой колонке u хотите обновить? – Crazy2crack

ответ

0

Один из способов сделать это может быть -

  • использовать свой первый запрос, который дает уникальные записи для «обидчика» записей, как вы называете их, и поместить их в временную таблицу (или таблица, созданная для временного назначения).

  • Удалить всех обижая записи в главной таблице SB_BATCH

  • , а затем снова повторно вставку из временной таблицы в таблице SB_BATCH.

Примечание. Если ваши идентификаторы уникальны и сгенерированы с использованием приращения/пользовательской логики, удалите &. Повторная установка может не сохранять их.

Если ваша цель - удалить/удалить дубликаты в таблице, то выше будет работать. Но я считаю, что неправильно понял ваш вопрос.

Смежные вопросы