Как удалить дубликаты из таблицы с помощью SQL-запроса - PullRequest
4 голосов
/ 06 октября 2011

У меня есть таблица, которая выглядит следующим образом:

emp_name   emp_address  sex  matial_status  
uuuu       eee          m    s
iiii       iii          f    s
uuuu       eee          m    s

Я хочу удалить дубликаты записей на основе 3 полей emp_name, emp_address и sex. и моя таблица результатов (после удаления дубликатов) должна выглядеть как -

emp_name    emp_address   sex   marital_status
uuuu        eee           m     s
iiii        iii           f     s

Я не могу вспомнить, как написать SQL-запрос для этого. Кто-нибудь, пожалуйста, помогите?

Ответы [ 7 ]

5 голосов
/ 06 октября 2011

Я бы создал новую таблицу с уникальным индексом по столбцам, которые вы хотите сохранить уникальными.Затем выполните вставку из старой таблицы в новую, игнорируя предупреждения о дублированных строках.Наконец, я бы удалил (или переименовал) старую таблицу и заменил ее новой таблицей.В MySQL это выглядело бы как

CREATE TABLE tmp LIKE mytable;
ALTER TABLE tmp ADD UNIQUE INDEX myindex (emp_name, emp_address, sex, marital_status);
INSERT IGNORE INTO tmp SELECT * FROM mytable;
DROP TABLE mytable;
RENAME TABLE tmp TO mytable;

или что-то похожее (это полностью не проверено).

4 голосов
/ 07 октября 2011

Это не запрос, а оператор удаления.Он удалит / удалит дубликаты строк из вашей таблицы

;with C as
(
  select row_number() over(partition by DUPLICATE_VAARS_DECISION 
                           order by NODE_EQ_NO) as rn
  from yourtable
)
delete C
where rn > 1

Если вы заинтересованы только в запросе к таблице и в результате получите недубликаты, вам следует использовать это вместо этого.

;with C as
(
  select *,
         row_number() over(partition by DUPLICATE_VAARS_DECISION 
                           order by NODE_EQ_NO) as rn
  from yourtable
)
select *
from C
where rn = 1
2 голосов
/ 06 октября 2011

в одну сторону

select emp_name,   emp_address,  sex,  max(marital_status) as marital_status
from Yourtable
group by emp_name,   emp_address,  sex

Поскольку я не знаю, что вы хотите, я использовал Макс для семейного положения

См. Также Включая связанные значения агрегированного столбца для дополнительных примеров

1 голос
/ 06 октября 2011

Похоже, что все четыре значения столбцов дублируются, поэтому вы можете сделать это -

select distinct emp_name, emp_address, sex, marital_status
from YourTable

Однако, если семейное положение может отличаться, и у вас есть какой-то другой столбец, на основе которого можно выбрать (например, если вам нужна последняя запись на основе столбца create_date), вы можете сделать это

select emp_name, emp_address, sex, marital_status
from YourTable a
where not exists (select 1 
                   from YourTable b
                  where b.emp_name = a.emp_name and
                        b.emp_address = a.emp_address and
                        b.sex = a.sex and
                        b.create_date >= a.create_date)
0 голосов
/ 08 декабря 2015

Я знаю, что это старый пост, но недавно я протестировал решение и хочу поделиться, если кто-то может найти мое решение полезным -

CREATE TABLE tmpTable LIKE yourTable;вставить в tmpTable (col1, col2 ... colN) ВЫБРАТЬ различно col1, col2 ... colN ОТ yourTable ГДЕ 1;дроп стол yourTable;Переименовать таблицу tmpTable TO yourTable;

Обратите внимание, вставка в оператор может выполняться без первичного ключа.

Спасибо.

0 голосов
/ 11 ноября 2015

Лучший ответ здесь:
Используйте этот оператор SQL для определения дополнительных дублированных строк:

 select * from Employee a <br/>
    where %%physloc%% > <br/>
        (select min(%%physloc%%) from Employee b <br/>
            where a.emp_name=b.emp_name and a.emp_address=b.emp_address and a.sex=b.sex); <br/>

Вы получите дополнительный ряд:

uuuu   eee m   s 


Используйте этот оператор SQL для удаления лишних дублированных строк:

 delete from Employee a <br/>
    where %%physloc%% > <br/>
        (select min(%%physloc%%) from Employee b <br/>
            where a.emp_name=b.emp_name and a.emp_address=b.emp_address and a.sex=b.sex); <br/> 


Для всех дублированных записей сохраняется только та, которая имеет самое низкое физическое местоположение Этот метод может применяться для удаления всех видов дублированных строк.

Я предполагаю, что вы используете MS SQL Server. Если вы используете Oracle DB, вы можете просто заменить ' %% physloc %% ' на ' rowid '

Наслаждайтесь кодом!

0 голосов
/ 06 октября 2011

Если у вас все в порядке с торговым пространством для производительности и простоты, то дубликаты в комбо emp_name | emp_address | sex могут быть устранены путем введения вычисляемого / производного столбца с использованием CHECKSUM() метода TSQL и DISTINCT ключевого слова при запросе.

Вот пример CHECKSUM:

SELECT CHECKSUM(*) FROM HumanResources.Employee WHERE EmployeeID = 2

Google вокруг и создать зависимый столбец, который содержит контрольную сумму из 3 столбцов.Затем вы можете выбрать отдельные строки, посмотрев на этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...