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 |
+----+------+--------------+

3voto

Harvinder Sidhu Punkte 31
SELECT t1.ColumnID,
CASE 
    WHEN NOT EXISTS( SELECT t2.FieldText  
                     FROM Table t2 
                     WHERE t2.ColumnID = t1.ColumnID) 
    THEN t1.FieldText
    ELSE t2.FieldText
END FieldText       
FROM Table1 t1, Table2 t2

2voto

elifekiz Punkte 1388

Alternativ dazu,

select id from call
minus
select id from phone_number

1voto

JoshYates1980 Punkte 3337
SELECT name, phone_number FROM Call a
WHERE a.phone_number NOT IN (SELECT b.phone_number FROM Phone_book b)

1voto

Simon_Weaver Punkte 129442

Vergessen Sie nicht, Ihre Indizes zu überprüfen!

Wenn Ihre Tabellen recht umfangreich sind, müssen Sie sicherstellen, dass das Telefonbuch einen Index auf der Seite phone_number Bereich. Bei großen Tabellen wird die Datenbank höchstwahrscheinlich beide Tabellen durchsuchen.

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

Sie sollten Indizes erstellen sowohl Phone_Book y Call die den phone_number . Wenn die Leistung ein Problem wird, versuchen Sie es mit einem schlanken Index wie diesem, der nur die Telefonnummer enthält:

Je weniger Felder, desto besser, da sie vollständig geladen werden müssen. Sie benötigen einen Index für beide Tabellen.

ALTER TABLE [dbo].Phone_Book ADD CONSTRAINT [IX_Unique_PhoneNumber] UNIQUE NONCLUSTERED 
(
    Phone_Number
)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = ON) ON [PRIMARY]
GO

Wenn Sie sich den Abfrageplan ansehen, wird er in etwa so aussehen, und Sie können bestätigen, dass Ihr neuer Index tatsächlich verwendet wird. Beachten Sie, dass dies für SQL Server gilt, aber für MySQL sollte es ähnlich sein.

Bei der von mir gezeigten Abfrage gibt es buchstäblich keine andere Möglichkeit für die Datenbank, ein anderes Ergebnis zu erzielen, als jeden Datensatz in beiden Tabellen zu durchsuchen.

enter image description here

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