Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46

Удалить одну запись из дублирующих

26.03.2020, 16:57. Показов 2748. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане.
Есть таблица в MS Access следующего вида:
202001472000012002000012
202001012000092001000068
202001012000092001000068
202001013000127001000032
202001013000127001000032
202001013000127001000032
202001013000127001000032
202001472000012002000012
202001472000012002000012
У каждой строки есть уникальный код.
Задача:
Удалить одну строку из каждого дубликата
Результат запроса должен быть следующего вида:
202001012000092001000068
202001013000127001000032
202001013000127001000032
202001013000127001000032
202001472000012002000012
202001472000012002000012

Обыскался в гугле, ничего не нашел, везде только запросы на удаление всех повторений разом.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2020, 16:57
Ответы с готовыми решениями:

Удалить одну запись из DbGrid-а
как мне сделать чтобы удалялась только одна запись из грида :'( if (Key=VK_DELETE) then begin if MessageDLg('Вы...

Удалить оба дублирующих элементов списка на Python
Приветствую формучане, столкнулся с такой проблемой, что не могу удалить оба дублирующих элементов в списке массива, использовал функцию...

Как добавить, удалить, обновить, прочитать только одну запись в JSON файл?
Вопросы 1. Как добавить, удалить, обновить, прочитать только одну запись в JSON файл? 2. Можно ли программно добавить, удалить запись...

12
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.03.2020, 17:45
Цитата Сообщение от Vartan23 Посмотреть сообщение
У каждой строки есть уникальный код.
Задача:
Удалить одну строку из каждого дубликата
Попробуйте запрос (с точностью до имен)
SQL
1
2
3
4
5
6
DELETE * FROM Таблица AS t0
WHERE EXISTS 
   (SELECT MIN([УникальныйКод]) AS mn 
    FROM Таблица t1 WHERE t1.[Поле]=t0.[Поле] 
    GROUP BY [Поле] 
    HAVING COUNT(*) >1 AND t0.[УникальныйКод]>MIN(t1.[УникальныйКод]) )
Добавлено через 22 минуты
Невнимательно прочел ТЗ. Если надо удалить только одну запись из каждой группы, то немного изменим показанный запрос. Вместо удаления всех записей у которых код больше минимального для группы, удалим только этот минимальный. Или максимальный. По вкусу
SQL
1
2
3
4
5
6
7
DELETE * FROM Таблица AS t0
WHERE EXISTS 
   (SELECT MIN([УникальныйКод]) AS mn 
    FROM Таблица t1 
    WHERE t1.[Поле]=t0.[Поле] 
    GROUP BY [Поле] 
    HAVING COUNT(*) >1 AND t0.[УникальныйКод]=MIN(t1.[УникальныйКод]))
2
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46
26.03.2020, 18:10  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
Попробуйте запрос (с точностью до имен)
SQL
1
2
3
4
5
6
DELETE * FROM Таблица AS t0
WHERE EXISTS 
   (SELECT MIN([УникальныйКод]) AS mn 
    FROM Таблица t1 WHERE t1.[Поле]=t0.[Поле] 
    GROUP BY [Поле] 
    HAVING COUNT(*) >1 AND t0.[УникальныйКод]>MIN(t1.[УникальныйКод]) )
Добавлено через 22 минуты
Невнимательно прочел ТЗ. Если надо удалить только одну запись из каждой группы, то немного изменим показанный запрос. Вместо удаления всех записей у которых код больше минимального для группы, удалим только этот минимальный. Или максимальный. По вкусу
SQL
1
2
3
4
5
6
7
DELETE * FROM Таблица AS t0
WHERE EXISTS 
   (SELECT MIN([УникальныйКод]) AS mn 
    FROM Таблица t1 
    WHERE t1.[Поле]=t0.[Поле] 
    GROUP BY [Поле] 
    HAVING COUNT(*) >1 AND t0.[УникальныйКод]=MIN(t1.[УникальныйКод]))
Да, ваш запрос работает, но нужен это немного не то, а второй запрос сейчас попробую

Добавлено через 6 минут
Ввел второй вариант, при выполнении всплывают окна, где нужно ввести значение, если ничего не вводить, то к удалению 0 строк, если единицы например, то к удалению все(((
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.03.2020, 18:30
Цитата Сообщение от Vartan23 Посмотреть сообщение
Ввел второй вариант, при выполнении всплывают окна, где нужно ввести значение, если ничего не вводить, то к удалению 0 строк, если единицы например, то к удалению все(((
Выложите Вашу БД с небольшим количеством записей. Если есть конфиденциальная информация забейте ее мусором.
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46
26.03.2020, 19:15  [ТС]
Приложил.
Таблица дубли
Вложения
Тип файла: rar Microsoft Access База данных.rar (3.70 Мб, 8 просмотров)
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.03.2020, 19:45
Vartan23, смотрите запрос УдалитьДубль. Практически ничего не менял кроме имен в исходном выражении запроса.
На моем, не самом сильном компе запрос работал 2 минуты. В т. [Копия дубли] исходные данные до удаления.
Вложения
Тип файла: zip Vartan23.zip (5.15 Мб, 2 просмотров)
0
Эксперт MS Access
 Аватар для Eugene-LS
12066 / 5849 / 1494
Регистрация: 05.10.2016
Сообщений: 16,440
26.03.2020, 20:40
Vartan23, вот ещё вам вариант (раз уж уже сделал) - отрабатывает относ. быстро.
SQL
1
2
DELETE дубли.* FROM дубли
WHERE (((дубли.код) IN (SELECT MAX(Код) AS Max_ID FROM дубли GROUP BY T1_Номер HAVING COUNT(дубли.T1_Номер)>1)));
Вложения
Тип файла: zip Microsoft Access База данных_v002.zip (1.06 Мб, 1 просмотров)
1
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46
26.03.2020, 20:52  [ТС]
При выполнении запроса УдалитьДубль с таблицей дубли ничего не происходит
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.03.2020, 20:59
Лучший ответ Сообщение было отмечено Vartan23 как решение

Решение

Мой вариант можно изменить и время выполнения сократится в 2 раза, до 1 минуты 5 секунд на моем компе.
SQL
1
2
3
4
5
6
7
DELETE *
FROM Дубли AS t0
WHERE EXISTS 
   (SELECT 1 
    FROM Дубли t1 
    GROUP BY [T1_Номер] 
    HAVING COUNT(*) >1 AND t0.[Код]=MIN(t1.[Код]));
Добавлено через 4 минуты
Цитата Сообщение от Vartan23 Посмотреть сообщение
При выполнении запроса УдалитьДубль с таблицей дубли ничего не происходит
Как это? В исходной таблице 8360 записей, а после удаления 4278. Предположу, что при выполнении запроса таблица дубли была открыта на рабочем столе. Чтобы ее обновить надо либо закрыть и снова открыть, либо обновить таблицу из меню
0
Эксперт MS Access
 Аватар для Eugene-LS
12066 / 5849 / 1494
Регистрация: 05.10.2016
Сообщений: 16,440
26.03.2020, 21:49
Vartan23, кстати!
А кодом удаление пошло гораздо быстрее (почти мгновенно!)

Вот вам вариант:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Private Sub УдалитьДубли()
'
'----------------------------------------------------------------
Dim s$
Dim l&
On Error GoTo УдалитьДубли_Err
    
    
    CreateTempTable
    
    DoCmd.Hourglass True 'Показать часики
    s = "INSERT INTO tmpДубли ( Max_ID ) SELECT Max(дубли.Код) AS Max_ID FROM дубли GROUP BY дубли.T1_Номер HAVING Count(дубли.T1_Номер)>1"
    CurrentDb.Execute s
    DoCmd.Hourglass False 'Вернуть нормальный курсор
 
    l = DCount("*", "tmpДубли")
    If l > 0 Then
        'Запрос поддтверждения удаления записи при ответе НЕТ - остановка
        If MsgBox("Действительно удалить:" & vbCrLf & l & " записей из таблицы [Дубли] ???", _
            vbYesNo + vbExclamation + vbDefaultButton1, _
            "Удаление данных") = vbNo Then Exit Sub
    Else
        MsgBox "Данных подлежащих удалению не обнаружено!", vbExclamation, "Нет данных!"
        Exit Sub
    End If
 
 
    DoCmd.Hourglass True 'Показать часики
    s = "DELETE дубли.* FROM дубли INNER JOIN tmpДубли ON дубли.Код = tmpДубли.Max_ID;"
    CurrentDb.Execute s
    DoCmd.Hourglass False 'Вернуть нормальный курсор
 
    MsgBox "Готово!", vbInformation, "OK!"
 
УдалитьДубли_End:
    On Error Resume Next
    DoCmd.Hourglass False 'Вернуть нормальный курсор
    Err.Clear
    Exit Sub
 
УдалитьДубли_Err:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in Sub УдалитьДубли.", _
        vbCritical, "Произошла ошибка!"
    Debug.Print "УдалитьДубли_Line: " & Erl & "."
    Err.Clear
    Resume УдалитьДубли_End
 
End Sub
 
Private Sub CreateTempTable()
'Создание временной Таблицы с кодами подлежащими удалению
'--------------------------------------------------------------------
Const strTableName As String = "tmpДубли" 'Название таблицы
Dim tbl As TableDef       'объект таблица
Dim idx As Index          'объект индекс
Dim fld As Field          'объект поле
Dim rst As Recordset      'объект набор записей
Dim i As Integer          'счетчик дней
 
'Удаяем прошлое
    On Error Resume Next
    CurrentDb.TableDefs.Delete strTableName
    Err.Clear
    
On Error GoTo CreateTempTableErr
 
'создание объектной переменной таблицы, полей и индекса в ней
    Set tbl = CurrentDb.CreateTableDef(strTableName)
    With tbl
        .Fields.Append tbl.CreateField("Max_ID", dbLong)
            'создание уникального индекса
            Set idx = .CreateIndex("Primary Key")
                With idx
                    'добавление поля в индекс
                    .Fields.Append .CreateField("Max_ID")
                    'Установка свойств индекса
                    .Unique = True   'Уникальный
                    .Primary = True  'Первичный
                End With
            .Indexes.Append idx
           'индекс создан
    End With
'Фактическое добавление таблицы из объектной переменной описанной выше
    CurrentDb.TableDefs.Append tbl
 
 
CreateTempTableBye:
    On Error Resume Next
    Set idx = Nothing
    Set tbl = Nothing
    rst.Close
    Set rst = Nothing
    Exit Sub
 
CreateTempTableErr:
    MsgBox "Произошла ошибка при выполнении процедуры " & _
    "[CreateTempTable] :" & vbCrLf & _
    Err.Description & vbCrLf & _
    "Номер ошибки = " & Err.Number, vbCritical
    Resume CreateTempTableBye
End Sub
Вложения
Тип файла: zip Microsoft Access База данных_v003.zip (525.0 Кб, 1 просмотров)
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46
26.03.2020, 21:50  [ТС]
Пишет, что данное действие или событие заблокировано в режиме отключения
0
Эксперт MS Access
 Аватар для Eugene-LS
12066 / 5849 / 1494
Регистрация: 05.10.2016
Сообщений: 16,440
26.03.2020, 22:01
Лучший ответ Сообщение было отмечено Vartan23 как решение

Решение

Цитата Сообщение от Eugene-LS Посмотреть сообщение
Вот вам вариант:
В идеале блок такой:
Visual Basic
1
2
3
4
5
6
УдалитьДубли_End:
    On Error Resume Next
    DoCmd.Hourglass False 'Вернуть нормальный курсор
    CurrentDb.TableDefs.Delete "tmpДубли"
    Err.Clear
    Exit Sub
... с уборкой "мусору"

Добавлено через 7 минут
Цитата Сообщение от Vartan23 Посмотреть сообщение
Пишет, что данное действие или событие заблокировано в режиме отключения
Странно - но возможно.

Попробуйте вместо:
Visual Basic
1
2
3
4
5
6
7
8
'Создание временной Таблицы с кодами подлежащими удалению
'--------------------------------------------------------------------
Const strTableName As String = "tmpДубли" 'Название таблицы
Dim tbl As TableDef       'объект таблица
Dim idx As Index          'объект индекс
Dim fld As Field          'объект поле
Dim rst As Recordset      'объект набор записей
Dim i As Integer

Написать:
[VB]
Visual Basic
1
2
3
4
5
Dim tbl As DAO.TableDef       'объект таблица
Dim idx As DAO.Index          'объект индекс
Dim fld As DAO.Field          'объект поле
Dim rst As DAO.Recordset      'объект набор записей
Dim i As Integer
0
0 / 0 / 0
Регистрация: 19.09.2014
Сообщений: 46
27.03.2020, 17:35  [ТС]
Всем спасибо за помощь!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2020, 17:35
Помогаю со студенческими работами здесь

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

Четыре кнопки на форме: добавить запись, удалить запись, закрыть, найти запись
Private Sub КнопкаДобавитьЗапись_Click() On Error GoTo Err_КнопкаДобавитьЗапись_Click DoCmd.GoToRecord , , acNewRec ...

Поменять любую запись местами с последней и удалить последнюю запись.
Помогите пожалуйста! Мне для программы, которая использует records (записи), нужно написать процедуру, которая меняет любую запись...

Составить программу с помощью которой можно добавить запись, удалить запись и распечатать дешевое издание.
program _file_LB7_Zeleniuk; type zurnal=record name:string; tiraz:integer; vartist:integer; end; var f:file of zurnal; ...

Выводит одну запись
пишу следующее private sub form_open() dim rst as recordset dim strSQl as string strSql='select kodPP, vrem form vr' set...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru