![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 18.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich,
Potrzebuję porady kogoś kto siedzi w SQL i ma pomysł jak rozwiązać mój problem.... Mam w pracy bazę danych która ma 2mln rekordów!! bazę wgrywałem kilka dni partiami z różnych źródeł i muszę przeprowadzić deduplikację przed oddaniem jej do szefa. Baza składa się z około 35 kolumn i mogą zdarzyć się przypadki że rekordy mają taką samą nazwę, adres, nip, itd. różnią się tylko np. telefonem albo mailem. Jedynym co na pewno ich różni to numer id w bazie... jedynym (moim)zdaniem sposobem jest usunięcie rekordów które są identyczne w całości wykluczając pole ID czy zna ktoś przepis na takie zapytanie?? coś w stylu -- usuń rekord jeżeli rekord minus [pole id] istnieje w bazie. ps. wykonanie kopii bazy i porównanie odpada bo zajęło by to co najmniej 2 dni! |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Mała podpowiedź, która Cię nakieruje:
To Ci zwróci po jednym rekordzie dla każdego z duplikatów w kolumnach, po których grupujesz + jako count ilość duplikatów. Dalej już łatwo. Może i istnieje łatwiejszy sposób, ale ja go nie znam (IMG:style_emoticons/default/snitch.gif) Ten post edytował sowiq 12.10.2012, 08:58:07 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 18.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
dzięki sowiq świetny sposób żeby wyświetlić listę rekordów identycznych, wyskoczyło mi 800 rekordów a praca na takiej ilości jest już o wiele prostsza:) kilka prostych operacji i dubli nie ma, dzięki za dobrą poradę(IMG:style_emoticons/default/smile.gif)
pozdrawiam |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Założenie indeksu nie usuwa duplikatów. Dostaniesz jedynie błąd, że nie można założyć indeksu, bo istnieją duplikujące się wartości: Dlatego jest tam IGNORE (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
To teraz gdzie jest haczyk? (IMG:style_emoticons/default/smile.gif) Próbowałem dla testu założyć taki indeks na swojej tabelce i wyrzuciło błąd zduplikowanych danych. Rozumiem, że nie jest warunkiem ilość kolumn większa niż 1. Jeśli ma to jakieś znaczenie, to typ tabelki to InnoDB
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Jaką masz wersję MySQL? Na 5.1+ powinno działać:
Kod a b c 1 2 3 1 2 4 2 3 3 2 4 4 2 4 5
Kod a b c
1 2 3 2 3 3 2 4 4 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Wiem, że powinno działać, dlatego pytam (IMG:style_emoticons/default/smile.gif)
Kod mysql> SHOW VARIABLES LIKE "version";
+---------------+--------+ | Variable_name | Value | +---------------+--------+ | version | 5.5.16 | +---------------+--------+ 1 row in set (0.00 sec) mysql> CREATE TABLE test ( -> a INT, -> b INT, -> c INT -> ) ENGINE=innodb; Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO `test` VALUES (1,2,3), (1,2,4), (2,3,3), (2,4,4), (2,4,5); Query OK, 5 rows affected (0.11 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM `test`; +------+------+------+ | a | b | c | +------+------+------+ | 1 | 2 | 3 | | 1 | 2 | 4 | | 2 | 3 | 3 | | 2 | 4 | 4 | | 2 | 4 | 5 | +------+------+------+ 5 rows in set (0.00 sec) mysql> ALTER IGNORE TABLE `test` ADD UNIQUE INDEX (a, b); ERROR 1062 (23000): Duplicate entry '1-2' for key 'a' Ten post edytował sowiq 12.10.2012, 13:07:27 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
http://mysqlolyk.wordpress.com/2012/02/18/...ys-give-errors/ (oraz http://bugs.mysql.com/bug.php?id=40344 )
Ciężko mi to jednak teraz sprawdzić, bo w tej chwili nie mam dostępu do 5.5. Ten post edytował redeemer 12.10.2012, 13:20:55 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Heh, człowiek uczy się całe życie. A ja jeszcze się nie nauczyłem, że jak coś działa pod 5.1 to nie znaczy, że będzie działało równie dobrze pod 5.5 (IMG:style_emoticons/default/wink.gif)
Dzięki za przekazanie trochę wiedzy (IMG:style_emoticons/default/smile.gif) Ten post edytował sowiq 12.10.2012, 13:40:35 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 10:15 |