MySQL多表非相等查询失效:为何无法筛选出目标教师数据?
SQL查询未得到预期结果的原因分析
数据表结构
Table_Teacher
id | name ----------------- 1 | Kevin 2 | Alex 3 | jax 4 | Albert
Table_Supervisor
id | id_teacher ----------------- 1 | 1 2 | 3
需求
从Table_Teacher表中查询出Alex和Albert这两条数据(即未出现在Table_Supervisor的id_teacher字段中的教师)。
错误查询语句
SELECT A.name FROM table_teacher A,tbl_supervisor B WHERE B.id_teacher != A.id;
问题根源
- 隐式笛卡尔积导致结果混乱:用逗号连接两张表会先生成笛卡尔积(4条教师记录 × 2条督导记录 = 8条组合),再过滤
B.id_teacher != A.id的记录。这会导致:- Kevin(id=1)会和督导表中id_teacher=3的记录匹配(1≠3),被错误查出;
- Jax(id=3)会和督导表中id_teacher=1的记录匹配(3≠1),被错误查出;
- Alex和Albert会分别和两条督导记录匹配,结果中出现重复条目。
- 逻辑完全偏离需求:需求是筛选「从未出现在督导表中的教师」,但当前语句的逻辑是「只要存在任意一个督导的id_teacher不等于当前教师id,就保留该教师」,和需求完全相悖。
正确实现方式
方式一:使用NOT EXISTS
SELECT A.name FROM Table_Teacher A WHERE NOT EXISTS ( SELECT 1 FROM Table_Supervisor B WHERE B.id_teacher = A.id );
方式二:使用NOT IN
SELECT name FROM Table_Teacher WHERE id NOT IN (SELECT id_teacher FROM Table_Supervisor);
内容的提问来源于stack exchange,提问作者zorojuro juju
相关产品推荐
相关产品推荐

