Mam następujące dwie tabele SQL (w MySQL):
Phone_book
+----+------+--------------+
| id | name | phone_number |
+----+------+--------------+
| 1 | John | 111111111111 |
+----+------+--------------+
| 2 | Jane | 222222222222 |
+----+------+--------------+
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 1 | 0945 | 111111111111 |
+----+------+--------------+
| 2 | 0950 | 222222222222 |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Jak sprawdzić, które połączenia zostały wykonane przez osoby, których phone_number
nie ma w Phone_book
? Pożądanym wynikiem byłoby:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Każda pomoc będzie mile widziana.
SELECT *
w podzapytaniu. Zamiast tego, na przykładSELECT 1
, powinno wystarczyć.Powinien usunąć podkwerendę, pozwalając optymalizatorowi zapytań na działanie swojej magii.
Unikaj również opcji „WYBIERZ *”, ponieważ może to spowodować uszkodzenie kodu, jeśli ktoś zmieni bazowe tabele lub widoki (i jest to nieefektywne).
źródło
1:N
związek między twoimi dwiema tabelami. LUB dodaj,DISTINCT
jak widać w odpowiedzi VladoPoniższy kod byłby nieco bardziej wydajny niż odpowiedzi przedstawione powyżej w przypadku większych zestawów danych.
źródło
Call
, jeśli jest wiele pasujących wierszyPhone_book
. To znaczy, jeśli istnieje1:N
związek między twoimi dwiema tabelami.LEFT OUTER JOIN
, sprawdź, czy jego wydajność jest lepsza.Zwróci to dodatkowe identyfikatory, których brakuje w tabeli Książka telefoniczna.
źródło
Myślę
źródło
id
Kolumna wcall
tabeli nie jest taka sama wartość jakid
kolumna wPhone_book
tabeli, więc nie można dołączyć na tych wartościach. Zobacz odpowiedź WOPR na podobne podejście.źródło
źródło
Alternatywnie,
źródło