Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 3
  • 74

Odpowiedzi (3)

  • 3

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

  • accdb

    usuwanie duplikatow.accdb ( 576K )
  • Odpowiedział
  • @ | 07.02.2017
  • TRENER ALTKOM AKADEMII
Komentarze
Dziękuję za szczegółową instrukcję, zadziałało. :)
Skomentował : @ Karol_Pisarek ,14.02.2017
  • 5
  • 1
  • 13
  • 3

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ą.

 

 

Jacek_Kotowski
  • Odpowiedział
  • @ Jacek_Kotowski | 14.02.2017
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94
  • 0

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?

 

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 22.03.2017
    • 2
    • 4
    • 8