[Delphi] Porównywanie 2 tabel - jaki algorytm?

0

Witam, mam 2 tabele o 1 kolumnie, ktora zawiera nazwy plików, teraz musze je porównac i wybrac które pliki sa w 1 tabeli a nie ma ich w drugiej i odwrotnie.
Jak to zrobic najszybciej ? W php zrobilem to na petlach ale dziala ok 40 sek.
Zaznaczam ze tabele te zawieraja ok 3 tys danych.
A moze da sie jakims jednym zapytaniem zagniezdzonym ?

0

TABLICA ROZPROSZONA - musisz zaimplementować algorytm haszowania.

0

Może 2 razy zapytanie:

SELECT kolumna
FROM tabela1
WHERE NOT kolumna IN (SELECT kolumna FROM tabela2)

Na MSSQL dla dwóch tabel z 60tys rekordów trwa to ok 1s.

0
hes napisał(a)

Może 2 razy zapytanie:

SELECT kolumna
FROM tabela1
WHERE NOT kolumna IN (SELECT kolumna FROM tabela2)

Na MSSQL dla dwóch tabel z 60tys rekordów trwa to ok 1s.

A mysql obsluguje zapytania zagniezdzone?

0

Od wersji 4.0 tak

0

Zainstalowalem wersje 4.0.24 - debug i zapodalem takie podzapytanie:

SELECT kod FROM zdjecia_serwer WHERE NOT kod IN (select kod from zdjecia)

I dostalem komunikat:
#1064 - Something is wrong in your syntax obok 'kod FROM zdjecia_serwer WHERE NOT kod IN (select kod from zdj' w linii 1

Dodam ze tabele zdjecia i zdjecia_serwer sa o identycznej strukturze czyli maja 2 kolumny, id oraz kod.

0

Masz rację. Na MySQL'u to nie zadziała, ale powinno zadziałać coś takiego:

SELECT zdjecia_serwer.kod
FROM zdjecia_serwer LEFT JOIN zdjecia ON zdjecia_serwer.kod=zdjecia.kod
WHERE zdjecia.kod IS NULL
0

Zainstalowalem na Krasnala 2.7 mysql-a 4.0 i wszystko bylo ok (chodzi mi o hasła) teraz zainstalowem 4.1 gdzie podobno sa podzapytania i nie moge sie dostac bo mnie nie wpuszczaa, jest jakies standardowe haslo ?

0

Standardowo jest chyba:
login: krasnal, hasło: krasnal
Najlepiej odpal MySQL Admina i tam w którejś zakładce są ustawienia w takim memo i na końcu tego textu znajduje się login i hasło.

0
hes napisał(a)

Masz rację. Na MySQL'u to nie zadziała, ale powinno zadziałać coś takiego:

SELECT zdjecia_serwer.kod
FROM zdjecia_serwer LEFT JOIN zdjecia ON zdjecia_serwer.kod=zdjecia.kod
WHERE zdjecia.kod IS NULL

Dziala ale predkosc koszmarna ponad minute trwa wyszukiwanie, nie ma czegos szybszego ? :-/

0
Glina napisał(a)

A mysql obsluguje zapytania zagniezdzone?
Nigdzie przed odpowiedzią hesa nie napisałeś, że chodzi o MySQL! Nie wymagaj domyślania się potrzebnych informacji przez Czytającego.

0

Możesz odczytać posortowane wartości z obu tabel i zrobić to w delphi. Czyli odczytujesz:

SELECT kod FROM zdjecia ORDER BY kod

Tak samo dla drugiej tabeli i w pętli czytajacej wszystkie elementy porównujesz je, przy czym:

  1. Jeśli elemety są różne, dodajesz mniejszy z nich do tabeli wynikowej zapytaniem INSERT i inkrementujesz jego licznik (nr. rekordu),
  2. Jaśli wlemety są równe, inkremetujesz licznik obu.
0
hes napisał(a)

Możesz odczytać posortowane wartości z obu tabel i zrobić to w delphi. Czyli odczytujesz:

SELECT kod FROM zdjecia ORDER BY kod

Tak samo dla drugiej tabeli i w pętli czytajacej wszystkie elementy porównujesz je, przy czym:

  1. Jeśli elemety są różne, dodajesz mniejszy z nich do tabeli wynikowej zapytaniem INSERT i inkrementujesz jego licznik (nr. rekordu),
  2. Jaśli wlemety są równe, inkremetujesz licznik obu.

Zrobilem tak, wrzucielm tabele do tablic i wszystko gra ale teraz jezeli w tablicy nr 1 jest np 300 rekordow a w tablicy 600 rekordow , to jak sie skonczy porownywanie reszta rekordow z tablicy 2 music byc tez wyrzucana jako nieobecna w tablicy nr 1 a to jak zrobic? :)
Bo to co napisalem gra jezeli jest po tyle samo elementow

1 użytkowników online, w tym zalogowanych: 0, gości: 1