Допустим, у меня есть таблица MySQL с четырьмя столбцами:
ID
DRIVER_ID
CAR_ID
ПРИМЕЧАНИЯ (NULL для большинства строк)
У меня есть несколько повторяющихся строк, в которых DRIVER_ID и CAR_ID совпадают. Для каждой пары DRIVER_ID и CAR_ID я хочу одну строку. Если одна из строк в наборе имеет НЕ-НУЛЬНЫЕ НОТЫ, я хочу эту, но в остальном это не имеет значения.
так что если у меня есть:
ID | DRIVER_ID | CAR_ID | NOTES
1 1 1 NULL
2 1 1 NULL
3 1 2 NULL
4 1 2 NULL
5 2 3 NULL
6 2 3 NULL
7 2 3 NULL
8 2 3 hi
9 3 5 NULL
Я хочу сохранить следующие идентификаторы: 9, 8, а затем по одному из [3,4] и [1,2].
Это огромный стол, и неуклюжие методы, которые я пробовал, безумно медленны, до такой степени, что, я уверен, я все делаю неправильно. Как я могу эффективно а) выбрать список идентификаторов для удаления? б) удалить их в одном запросе?
(И да, я знаю сделку с составными ключами. Здесь это не проблема.)
РЕДАКТИРОВАТЬ: Извините, забыл указать, что это был MySQL.
Некоторые вещи, которые я пробовал до сих пор:
select ID, COUNT(DRIVER_ID) rowcount from CARS_DRIVERS group by CAR_ID,DRIVER_ID HAVING rowcount > 1;
даст мне один идентификатор на группу. Однако не обязательно оставлять строку с NOTES, если она есть. Это также даст мне только один идентификатор на дубликат группы. В некоторых случаях существует более 20 повторяющихся комбинаций, поэтому мне придется повторять это снова и снова, чтобы свести каждую группу к одной строке.
select distinct t1.ID from CARS_DRIVERS t1 where exists (select * from CARS_DRIVERS t2 where t2.CAR_ID = t1.CAR_ID and t2.DRIVER_ID = t1.DRIVER_ID and t2.id > t1.id);
Это намного медленнее и все еще не решает проблему NOTES. Он имеет преимущество в получении самой старой строки для каждой группы, которая, если я не могу легко выделить в поле NOTES, может быть прокси для этого. Если строка в наборе имеет NOTES, я считаю, что она всегда самая старая (с наименьшим ID), но я не уверена.
Некоторый дополнительный контекст: DRIVER_ID и CAR_ID не являются реальными именами столбцов, и в таблице есть другие столбцы. Я пытался разобрать информацию, чтобы понять причину проблемы, но из комментария W4M я вижу, что это выглядит как домашнее задание. Реальная сделка заключается в том, что я смотрю на очень неоптимизированную базу данных (обычно это не входит в мои обязанности), и при попытке избавиться от этих ошибок перед добавлением ключа операция выполняется вечно. Как в часах. Стол большой, но, конечно, это не оправдывает. Я пытаюсь использовать свой ограниченный опыт в SQL и найти способ сделать это. Не важно, хороша ли она, я могу сидеть в командной строке и перебирать кучу запросов, если это необходимо. Но я заметил, что ВЫБОР идентификаторов, которые являются кандидатами на удаление, занимает всего несколько секунд, и хотя таблица огромна, общее количество удаляемых строк составляет менее 10 КБ, поэтому должен быть способ сделать это без какого-либо сценария, который занимает целые выходные до финиша.