![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 281 Pomógł: 0 Dołączył: 8.07.2005 Skąd: EU Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam oto takie zagadnienie: w bazie mam dwie tabele A i B w kazdej z nich jest pole 'numer'. W tabeli A jest rekordów 500 a w tabeli B rekordów jest 700. w A rekordy sa numerowane od 1do500 a w B od 1do700 i teraz chcialbym wybrac z tabeli B tylko te 200 które nie istnieja w tabeli A. aby wybrać te same rekordy musiał bym napisać
a jak napisać zapytanie aby wybrać z B tylko te które nie znajdują sie w tabeli A? pozdrawiam -------------------- człowiek nie sznurek wszystko wytrzyma
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
a to tak w wydajny sposób
Kod SELECT a.*
FROM a LEFT JOIN b ON a.numer = b.numer WHERE b.numer IS NULL |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mchl::zastanowlio mnie czy rzeczywiscie twoj sposob jest wydajniejszy... na logike, jesli brac pod uwage ilosc operacji jakie trzeba wykonac, na to by nie wskazywal, to chyba by byla kwestia lepszej lu gorszej implementacji danego polecenia w core bazy danych.
jednak nadal polemizowalbym ze to jest wydajniejszy sposob.... wg mnie koszt jest porownywalny, ja sprawdzalem na tabelach po ok 20000 rekordow - czasy wykonania byly niemal identyczne.... czytelnosc - kwestia gustu.. dla mnie wydaje sie wygodniejsze podzapytanie w tym przypadku
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
http://dev.mysql.com/doc/refman/5.1/en/opt...subqueries.html
http://dev.mysql.com/doc/refman/5.1/en/rew...subqueries.html Taki sposób jest wydajniejszy w ogólności. W szczególnym przypadku nie musi być. W tym konkretnym akurat nie ma narzuconych dodatkowych warunków na rekordy tabeli b w zależności od tabeli a. (np FROM b WHERE b.data = a.data) Gdyby takowe były, to podzapytanie wykonywałoby się dla każdego wiersza tabeli a. Od wersji 5.4 optymizator sam potrafi (podobno) takie podzapytanie zoptymalizować, więc już nie będą potrzebne takie sztuczki Ten post edytował Mchl 25.03.2010, 16:03:54 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 31.07.2025 - 08:56 |