sql >> Databáze >  >> RDS >> Mysql

MySQL „NOT IN“ dotazuje 3 tabulky

Vyhněte se NOT IN jako mor kdyby

SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1

může někdy obsahovat NULL. Místo toho použijte NOT EXISTS nebo Left Joins

použijte explicitní spojení, nikoli spojení stylu z 80. let pomocí WHERE doložka

Pro ilustraci utrpení NOT IN:

SQL NENÍ V () nebezpečí

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
);

Chunk1:

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

** 3 řádky, podle očekávání **

Část 2:

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);

žádné řádky, co?

Je zřejmé, že je to „nesprávné“. Vzniká z toho, že SQL používá logiku se třemi hodnotami, řízenou existencí NULL, což je nehodnota indikující chybějící (nebo NEZNÁMÉ) informace. S NOT IN, Chunk2 je to přeloženo takto:

status NOT IN ('married', 'divorced', 'widowed', NULL)

To je ekvivalentní:

NOT(status='single' OR status='married' OR status='widowed' OR status=NULL)

Výraz "status=NULL" se vyhodnotí jako NEZNÁMÝ a podle pravidel tříhodnotové logiky se NEZNÁMÝ také vyhodnotí jako NEZNÁMÝ. V důsledku toho jsou všechny řádky odfiltrovány a dotaz vrátí prázdnou sadu.

Mezi možná řešení patří:

select s.status
from mstatus s
left join people p
on p.status=s.status
where p.status is null

nebo použijte not exists



  1. Nástroje pro generování databázového diagramu/ER diagramu ze stávající databáze Oracle?

  2. Smazat pomocí levého spojení v Oracle 10g

  3. Jak mohu vložit data do SQL Server pomocí VBNet

  4. Přejmenování primárního klíče v SQL Server (T-SQL)