Удалить повторяющиеся строки из результата таблицы MySQL - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть таблица с именем consignment, в которой есть несколько повторяющихся строк в столбце «service», где service = 'CLRC'.

select * from consignment where service='CLRC'

Когда я выбираю строки, у меня всего 2023 строки, которые содержат дубликаты.

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

Когда выполняется выбор, он возвращает 64431 записей.Это правильно?

select t1.hawb FROM consignment t1
INNER JOIN consignment t2 
WHERE 
    t1.id < t2.id AND 
    t1.hawb = t2.hawb
    and t1.service='CLRC'

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Если вы ожидаете, что ваш запрос вернет количество дубликатов, то нет, это не правильно.Условие t1.id < t2.id объединяет каждые id из t1 со всеми id с t2, которые больше, что приводит к большему количеству строк или меньшему количеству строк (в случае только 2 дубликатов) и редко к ожидаемому числу,Смотрите демо .Если вы хотите увидеть все дубликаты:

select * from consignment t
where t.service = 'CLRC' 
and exists (
  select 1 from consignment
  where service = t.service and id <> t.id and hawb = t.hawb 
)  

См. Демоверсию .Если вы хотите удалить дубликаты и оставить только один с максимальным значением id для каждого hawb, тогда:

delete from consignment
where service='CLRC'
and id not in (
  select id from (
    select max(id) id from consignment
    where service='CLRC' 
    group by hawb
  ) t  
);

См. Демонстрационную версию .

0 голосов
/ 26 сентября 2019

Включить все столбцы в соответствующее условие, кроме столбца id, в качестве первичного ключа:

delete t1 
  from consignment t1
  join consignment t2 
 where t1.id < t2.id 
   and t1.hawb = t2.hawb
   and t1.col1=t2.col1
   and t1.col2=t2.col2   
   ......
   and t1.service='CLRC';

Демо

Вы можетепроверьте количество дубликатов с помощью

select count(*) from
(
select distinct hawb, col1, col2, service --  (all columns except `id`)
  from consignment
) q 

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

...