![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
mysql5 - Tabela A zawiera cechę (EAN) w dwóch kolumnach kol1 i kol2. Co najmniej w jednej z nich jest cecha, czyli wpisany jakiś kod EAN, a druga kolumna jest pusta a czasem są wpisane dwa kody (oczywiście w obu kolumnach).
Dostawca dostarcza tabele B, w której jest kolumna "kolean", która powinna być zawsze uzupełniona. Muszę: 1. znaleźć rekordy, któe są w tabeli A a nie ma ich w tabeli B 2. znaleźć rekordy, któe są w tabeli B a nie ma ich w tabeli A jak to zrobić łatwo, przyjemniej i w miarę optymalnie? Na moje oko: Ad.2. SELECT * FROM B WHERE kolean NOT IN (SELECT kol1, kol2 FROM A WHERE kol1<>'' OR kol2<>'') Ale mam wątpliwość do przypadku 1., wiec proszę o jakieś sugestie, bo taka konstrukcja wydaje mi się z lekka porąbana: SELECT * FROM A WHERE (kol1 NOT IN (SELECT kolean FROM B WHERE jakistamwarunekpomocniczy)) OR (kol2 NOT IN (SELECT kolean FROM B WHERE jakistamwarunekpomocniczy)) Oczywiście zawsze mogę lecieć rekord po rekordzie, np wziąc wszystkie rekordy z bazy B, porównywać rekord po rekordzie z A i w zalezności od wyniku robić coś z odpowiedzią, wtedy będę miał "obrobione" wszystkie rekordy w bazie B. Zaś znalezienie rekordów z A, których nie ma w B - lecieć rekord po rekordzie po bazie A i tylko reagowac na takie, których nie ma w tabeli B. No ale to już raczej będzie wybitnie nieoptymalne i liczba selectów będzie ładna. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Zauważ, że raz masz do sprawdzenia jedną, a raz 2 kolumny... By to uzgodnić, można użyć UNION choćby. Robisz zwykły UNION na tej samej tabeli, wybierając raz jedną, a raz drugą kolumnę. W ten sposób wyciągniesz wszystkie unikatowe EAN. Oczywiście musisz brać niepuste EAN. W ten sposób można jednak tylko uzyskać wartości EAN unikatowe. Jeśli chcesz wszystkie wiersze wyciągnąć, musisz jeszcze ciutkę dalej pociągnąć.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Takie dwa zapytania:
SELECT * FROM `_tabA` LEFT JOIN _tabB ON pole IN (pole1, pole2) WHERE _tabB.id is null i SELECT * FROM `_tabA` RIGHT join _tabB ON pole IN (pole1, pole2) WHERE _tabA.id is null |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Takie dwa zapytania: SELECT * FROM `_tabA` LEFT JOIN _tabB ON pole IN (pole1, pole2) WHERE _tabB.id is null i SELECT * FROM `_tabA` RIGHT join _tabB ON pole IN (pole1, pole2) WHERE _tabA.id is null "gro, bucy, śpiwo i tańcy" Dzięki za powyższe, jak widać błądziłem z tym NOT IN.... Tylko z tym RIGHT JOIN w takim przykładzie trzeba bardzo uważać: SELECT * FROM `_tabA` RIGHT join _tabB ON pole IN (pole1, pole2) WHERE _tabA.id is null Okazało się że powyższe zapytanie na danych testowych wykonywało się 15 sekund, a rozdzielenie zapytania na dwa (na oko mniej optymalne): 1. Pytamy o wszystkie rekordy tabeli B spełniające warunki pomocnicze 2. później lecimy pętlą rekord po rekordzie i pytamy czy w tabeli A jest rekord że kolean = kol1 or kolean = kol2 wykonuje się 0.15 sekundy, czyli 100x szybciej winą tego pewnie jest to, że w tabeli B jest ze 20k rekordów a w tabeli A 1k rekordów Ten post edytował skleps 22.11.2012, 16:47:47 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 18:24 |