Heim > Datenbank > MySQL-Tutorial > Warum schlägt MySQLs „NOT IN' mit drei Tabellen und NULL-Werten fehl und was sind die besseren Alternativen?

Warum schlägt MySQLs „NOT IN' mit drei Tabellen und NULL-Werten fehl und was sind die besseren Alternativen?

DDD
Freigeben: 2024-12-31 05:49:09
Original
1041 Leute haben es durchsucht

Why Does MySQL's

MySQL „NOT IN“ drei Tabellen abfragen

Wenn Sie mit drei Tabellen arbeiten, verwenden Sie den „NOT IN“-Operator in einer Abfrage kann problematisch sein, insbesondere beim Umgang mit NULL-Werten. Dieser Artikel zeigt die mit der Verwendung von „NOT IN“ verbundenen Risiken auf und schlägt alternative Lösungen vor.

Das Problem

Die bereitgestellte Abfrage versucht, zwei Tabellen, Grade und, zu vergleichen Bewertung: Identifizieren von Datensätzen in der Note, die in der Bewertung nicht vorhanden sind. Wenn der angegebene Name („JOHN“) jedoch in der Auswertung nicht vorhanden ist, gibt die Abfrage keine Ausgabe zurück.

Solution

Um dieses Problem zu beheben Vermeiden Sie die Verwendung von „NOT IN“, wenn die zum Filtern von Daten verwendete Unterabfrage möglicherweise NULL-Werte enthält. Erwägen Sie stattdessen die Verwendung von „NOT EXISTS“ oder Left-Joins.

Lassen Sie uns die potenziellen Gefahren der Verwendung von „NOT IN“ veranschaulichen:

SQL „NICHT IN“ Gefahr

Erstellen Sie die mStatus- und Personentabellen mit Beispiel Daten:

create table mStatus
(   id int auto_increment primary key,
    status varchar(10) not null
);
insert mStatus (status) values ('single'),('married'),('divorced'),('widow');

create table people
(   id int auto_increment primary key,
    fullName varchar(100) not null,
    status varchar(10)  null
);
Nach dem Login kopieren

Chunk1:

truncate table people;
insert people (fullName,`status`) values ('John Henry','single');
select * from mstatus where `status` not in (select status from people);
Nach dem Login kopieren

Erwartete Ausgabe: 3 Zeilen

Chunk2:

truncate table people;
insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null);
select * from mstatus where status not in (select status from people);
Nach dem Login kopieren

Unerwartete Ausgabe: 0 Zeilen

Der zweite Block gibt aufgrund der dreiwertigen Logik von SQL unerwartet keine Zeilen zurück. Wenn die Unterabfrage NULL-Werte enthält, kann der Ausdruck „NOT IN“ als UNKNOWN ausgewertet werden, was dazu führt, dass alle Zeilen herausgefiltert werden.

Alternatives

Um dieses Problem zu beheben Problem, verwenden Sie „LEFT JOIN“ oder „NOT“. EXISTS":

select s.status
from mstatus s
left join people p
on p.status=s.status
where p.status is null
Nach dem Login kopieren
select s.status
from mstatus s
where not exists (select 1 from people where people.status=s.status)
Nach dem Login kopieren

Diese alternativen Lösungen verarbeiten NULL-Werte korrekt und liefern die gewünschte Ausgabe.

Das obige ist der detaillierte Inhalt vonWarum schlägt MySQLs „NOT IN' mit drei Tabellen und NULL-Werten fehl und was sind die besseren Alternativen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage