406 Stimmen

Datensätze aus einer Tabelle suchen, die in einer anderen nicht vorhanden sind

Ich habe die folgenden zwei 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 kann ich herausfinden, welche Anrufe von Personen getätigt wurden, deren phone_number ist nicht in der Phone_book ? Die gewünschte Ausgabe wäre:

Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3  | 1045 | 333333333333 |
+----+------+--------------+

586voto

Alnitak Punkte 324207

Es gibt verschiedene Möglichkeiten, dies zu tun, mit unterschiedlicher Effizienz, je nachdem, wie gut Ihr Abfrageoptimierer ist und wie groß Ihre beiden Tabellen sind:

Dies ist die kürzeste Aussage und kann am schnellsten sein, wenn Ihr Telefonbuch sehr kurz ist:

SELECT  *
FROM    Call
WHERE   phone_number NOT IN (SELECT phone_number FROM Phone_book)

alternativ (Dank an Alterleben )

SELECT *
FROM   Call
WHERE  NOT EXISTS
  (SELECT *
   FROM   Phone_book
   WHERE  Phone_book.phone_number = Call.phone_number)

oder (Dank an WOPR)

SELECT * 
FROM   Call
LEFT OUTER JOIN Phone_Book
  ON (Call.phone_number = Phone_book.phone_number)
  WHERE Phone_book.phone_number IS NULL

(abgesehen davon, dass es normalerweise am besten ist, nur die gewünschten Spalten auszuwählen, nicht ' * ')

122voto

WOPR Punkte 5117
SELECT Call.ID, Call.date, Call.phone_number 
FROM Call 
LEFT OUTER JOIN Phone_Book 
  ON (Call.phone_number=Phone_book.phone_number) 
  WHERE Phone_book.phone_number IS NULL

Sollte die Unterabfrage entfernen, damit der Abfrageoptimierer seine Arbeit tun kann.

Vermeiden Sie außerdem "SELECT *", da es Ihren Code zerstören kann, wenn jemand die zugrunde liegenden Tabellen oder Ansichten ändert (und es ist ineffizient).

31voto

Alterlife Punkte 6341

Der nachstehende Code wäre etwas effizienter als die oben dargestellten Antworten, wenn es um größere Datensätze geht.

SELECT *
FROM Call
WHERE NOT EXISTS (
    SELECT 'x'
    FROM Phone_book
    WHERE Phone_book.phone_number = Call.phone_number
);

7voto

Vlado Punkte 2927
SELECT DISTINCT Call.id 
FROM Call 
LEFT OUTER JOIN Phone_book USING (id) 
WHERE Phone_book.id IS NULL

Dies gibt die zusätzlichen Ids zurück, die in Ihrer Phone_book-Tabelle fehlen.

5voto

A dev Punkte 810

Ich denke

SELECT CALL.* FROM CALL LEFT JOIN Phone_book ON 
CALL.id = Phone_book.id WHERE Phone_book.name IS NULL

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X