Ich habe die folgenden zwei SQL-Tabellen (in 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 |
+----+------+--------------+
Wie finde ich heraus, welche Anrufe von Personen getätigt wurden, die phone_number
nicht in der sind Phone_book
? Die gewünschte Ausgabe wäre:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Jede Hilfe wäre sehr dankbar.
SELECT *
in der Unterabfrage. Stattdessen sollte zum BeispielSELECT 1
hübsch genug sein.Sollte die Unterabfrage entfernen, damit der Abfrageoptimierer seine Magie entfalten kann.
Vermeiden Sie außerdem "SELECT *", da dies Ihren Code beschädigen kann, wenn jemand die zugrunde liegenden Tabellen oder Ansichten ändert (und dies ineffizient ist).
quelle
1:N
Beziehung zwischen Ihren beiden Tabellen gibt. ODER fügen Sie hinzu,DISTINCT
wie in Vlados Antwort zu sehenDer folgende Code wäre etwas effizienter als die oben dargestellten Antworten, wenn es sich um größere Datensätze handelt.
quelle
Call
, wenn mehrere übereinstimmende Zeilen vorhanden sindPhone_book
. Das heißt, wenn es eine1:N
Beziehung zwischen Ihren beiden Tabellen gibt.LEFT OUTER JOIN
, um festzustellen , ob die Leistung besser ist.Dadurch werden die zusätzlichen IDs zurückgegeben, die in Ihrer Phone_book-Tabelle fehlen.
quelle
Ich glaube
quelle
id
Spalte in dercall
Tabelle hat nicht den gleichen Wert wie dieid
Spalte in derPhone_book
Tabelle, daher können Sie diesen Werten nicht beitreten. Siehe die Antwort von WOPR für einen ähnlichen Ansatz.quelle
quelle
Alternative,
quelle