Witam.
W jaki sposób usunąć z bazy danych rekordy ze zduplikowanymi wartościami? W założeniu różne jest tylko pole ID, a reszta pól zawiera dokładne te same dane.
Witam.
W jaki sposób usunąć z bazy danych rekordy ze zduplikowanymi wartościami? W założeniu różne jest tylko pole ID, a reszta pól zawiera dokładne te same dane.
Panie Karolu Ja bym to zrobił tak:
Mamy tabelę danych:
Budujemy pierwszą kwerendę
Wstęga:
Wybieramy tabelę, na której usuwamy duplikaty i dalej:
Wybieramy pola tabeli, gdzie szukamy duplikatów i dalej:
Dodajemy kolumnę, gdzie mamy wartości unikatowe i dalej:
Nazywamy jakoś rozsądnie kwerendę:
Kwerenda wyświetla WSZYSTKIE rekordy, gdzie są zduplikowane interesujące nas dane
Tu moglibyśmy zakończyć i zamienić tą kwerendę na usuwającą, ale usunie nam WSZYSKIE znalezione rekordy.
Zakładam, że chcemy usunąć tylko kolejne wystąpienia i pozostawić po jednym unikatowym rekordzie ze znalezionych.
To robimy dalej.
Następna kwerenda.
Budujemy nową kwerendę, której źródłem jest nasza wcześniejsza kwerenda tu duplikaty:
Robimy z niej kwerendę sumującą.
Wstęga Projektowanie Sumy:
Zmieniamy pod kolumną id zapis na Pierwszy:
Zapisujemy pod jakąś rozsądną nazwą, tu będzie duplikaty_pierwszy.
Ponownie otwieramy i przechodzimy do widoku SQL:
Nazwy kolumn sumujących mają zmieniane automatycznie nazwy (trochę dziwacznie brzmią), w celach kosmetycznych i przy okazji ułatwiając sobie później pracę zmieniamy nazwę na prostszą
Przed zmianą:
Po zmianie (w tym przypadku zostawiłem nazwę id):
Zamykamy zapisujemy zmiany.
Mamy kwerendę wyświetlającą nam pierwsze wystąpienie zduplikowanych rekordów, chcemy usunąć pozostałe wystąpienia.
Tworzymy kolejną kwerendę.
Jej źródłem są dwie wcześniejsze kwerendy:
Łączymy te kwerendy po polu id i wchodzimy do właściwości sprzężenia:
Ustawiamy właściwości jak na zdjęciu poniżej:
W kwerendzie wybieramy kolumny jak na zdjęciu poniżej:
Wynik działania kwerendy:
Interesują nas tylko te id, które nie występują w kwerendzie duplikaty_pierwsze.
Więc w trybie projektowanie dopisujemy kryterium is null:
Wynik działania kwerendy:
Jeszcze tylko, aby się kolumna id z kwerendy duplikaty_pierwsze nie wyświetlała:
Zamykamy zapisujemy, tu będzie do_usuniecia.
Tworzymy kolejną kwerendę.
Źródłem do niej będzie tabela, gdzie chcemy usunąć duplikaty.
Kolumny jak na zdjęciu poniżej:
Zmieniamy kwerendę na usuwającą - wstęga Projektowanie - Usuń:
Wygląd kwerendy:
W kryteria pod kolumną id wchodzimy i wpisujemy (można użyć konstruktora).
DLookUp("id";"do_usuniecia";"id =" & [Tabela1]![id])
Tu jest link przedstawiający zasady działania dlookup:
https://support.office.com/pl-pl/article/Funkcja-DLookup-8896cb03-e31f-45d1-86db-bed10dca5937
Zapisujemy kwerendę (tu nazwa usun).
W bazie jest kopia tabeli do testów.
Patrz załączony plik.
PS. Pewnie w samym sql da się to napisać, niestety zbyt słabo go znam ... jeszcze. :)
Załączniki
DELETE *
FROM Tabela1
WHERE [id] NOT IN
( SELECT Max(Tabela1.id) AS id
FROM Tabela1
GROUP BY Tabela1.imie, Tabela1.nazwisko, Tabela1.dane);
W linii GROUP by można określić, gdzie szukamy duplikatów, w jakich kolumnach:
Select Max... można użyć First(), albo Min(), żeby określić, które zduplikowane rekordy zachować.
Proszę o sprawdzenie, nie mam Accessa pod ręką.
Kwerenda wybierająca działa, ale usuwająca już nie. Czy może to być spowodowane tym, że porównywane pola mają wartości typu:
"Igła" Zakład Krawiecki Jan Kowalski, Adam Nowak? Bo w nazwie są i cudzysłów i przecinek. Czy to może mieć znaczenie, bo przy zastosowaniu IN argumenty w zbiorze porównywanym są oddzielane przecinkami?