Access 2010 SQL — Показать повторяющиеся записи в порядке возможного удаления (чистое решение SQL, пожалуйста)

У меня есть следующая таблица с именем «flt»

Вы можете видеть, что дубликаты идентифицируются только по 3 столбцам (flight, fltno, stad)... Меня не волнует, что находится в col1 and col2.. Но я должен быть в состоянии показать это в запросе.

Итак... вы можете видеть, что ids 8, 3 and 10 являются дубликатами.

Я хочу написать чистый SQL-запрос... который может сделать следующее:

1) столбец duplicate count.. который в основном подсчитывает, сколько записей соответствует flight, fltno, stad текущей выбранной строки.

2) столбец "duplicate rank", который упорядочивает дубликаты. 1 означает первую запись, 2 означает, что это вторая запись, а 3 означает, что это третья запись. Вы можете видеть, что ba 104 имеет всего 2 записи... и занимает 1 и 2 место.

3) из результирующего (возможно, редактируемого) запроса. Я должен иметь возможность отфильтровать (используя где) все повторяющиеся ранги, которые > 1... а затем удалить эти записи. Итак.. id 8, 3 and 10 are > 1.. и я должен иметь возможность удалить их в этом запросе... щелкнув строку и клавишу удаления.

Если условие 3 не совсем достижимо... пожалуйста, дайте мне лучший способ. Спасибо.

введите здесь описание изображения


person ihightower    schedule 14.06.2013    source источник


Ответы (3)


Этот SQL даст вам результаты в соответствии с вашим вопросом, однако он не будет работать как часть запроса DELETE, я предлагаю ВЫБРАТЬ из этого запроса во временную таблицу, а затем запустить из нее запрос DELETE :)

SELECT A.id, A.flight, A.fltno, A.stad, A.col1, A.col2, B.concount AS [duplicate count], (SELECT Count(C.id) FROM tblfit As C WHERE C.flight&C.fltno&C.stad=A.concat AND C.id <= A.id) AS [duplicate rank]
FROM (SELECT tblfit.*, [flight] & [fltno] & [stad] AS concat
FROM tblfit) AS A,
(SELECT [flight] & [fltno] & [stad] AS concat, Count([concat]) AS concount
FROM tblfit
GROUP BY [flight] & [fltno] & [stad]) AS B
WHERE A.concat = B.concat;
person Matt Donnan    schedule 14.06.2013
comment
Я перенастраиваю ваш запрос, чтобы он соответствовал моей фактической таблице, и думаю, что смогу заставить его работать. Однако я просто хочу подчеркнуть, что есть некоторые проблемы с скобками. Пожалуйста, дайте мне знать.Я сообщу окончательный запрос, когда смогу снова заставить его работать.Спасибо. - person ihightower; 14.06.2013
comment
@ihightower Исходный запрос написан с использованием стандартных скобок без . перед псевдонимом, однако при использовании соединений с производными таблицами Access автоматически изменяет SQL, чтобы включить [ и ., не знаю, почему, если честно - person Matt Donnan; 14.06.2013
comment
@ihightower Я изменил запрос, чтобы вместо этого использовать соединения в предложении WHERE, чтобы избежать проблем с скобками, см. обновленный SQL :) - person Matt Donnan; 14.06.2013
comment
это было именно то изменение, которое я сделал... и теперь оно отлично работает. Большое спасибо. Получил то, что хотел... За то, что хотел большего.. Просто интересно, является ли это нормальным эффективным подходом... (поскольку время отклика немного медленное)... и в любом случае сделать набор записей редактируемым. - person ihightower; 14.06.2013
comment
К сожалению, ранжирующие запросы @ihightower не являются родными для Access, как и для других баз данных, поэтому повторный запуск подсчета SQL замедлит работу, может помочь проверка наличия всех необходимых индексов таблиц. Невозможно сделать такой запрос редактируемым напрямую, однако ссылка, предоставленная общим доступом, может позволить вам включить этот запрос в запрос DELETE. В качестве примечания попробуйте выполнить сжатие и восстановление после сохранения этого запроса, поскольку Access затем повторно оценит свои планы выполнения запросов и может ускорить процесс. - person Matt Donnan; 14.06.2013

Добавлен столбец в таблице, где значение всегда 1 называется

countValue

Затем первый запрос на количество дубликатов

SELECT tableA.flight, tableA.fltno, tableA.stad, Sum(tableA.countValue) AS duplicateCount
FROM tableA
GROUP BY tableA.flight, tableA.fltno, tableA.stad;

Затем второй запрос для повторяющегося ранга (ранжированного по идентификационному номеру)

SELECT (SELECT Count(*)+1 FROM tableA WHERE id < temp.id AND stad = temp.stad AND flight = temp.flight AND fltno = temp.fltno) AS flightRank, temp.id, temp.flight, temp.fltno, temp.stad
FROM tableA AS temp;

Тогда вы можете присоединиться к ним

SELECT tableA.id, tableA.flight, tableA.fltno, tableA.stad, tableA.col1, tableA.col2, queryCounts.duplicateCount, queryRanking.flightRank
FROM (tableA INNER JOIN queryRanking ON tableA.id = queryRanking.id) INNER JOIN queryCounts ON (tableA.stad = queryCounts.stad) AND (tableA.fltno = queryCounts.fltno) AND (tableA.flight = queryCounts.flight);

Затем, что касается запроса на удаление, прочитайте эту ветку, так как вам нужно удалить с помощью соединений.

Как удалить в MS Access при использовании JOIN?

person ashareef    schedule 14.06.2013

Это решит вопрос 1. Я не верю, что на все 3 вопроса можно ответить в одном запросе.

Select Flight, FltNo, Stad, Sum(1) as DupCnt
from FLT
Group By Flight, FltNo, Stad
order by Sum(1) DESC

Откуда вы знаете, что хотите удалить 8 и 3, а не 4 и 10?

person Johnny Bones    schedule 14.06.2013