首页 > 解决方案 > 选择不在使用多个连接语句创建的表中的行

问题描述

我有这样的架构:

create table AppUser (id int, name varchar(255));
insert into AppUser (id, name) values ('1','sashan');
insert into AppUser (id, name) values ('2','someone');
insert into AppUser (id, name) values ('3','mckenzie');
create table school (id int, name varchar(255));
insert into School (id, name) values ('1','pascoe high');
insert into School (id, name) values ('2','highbury');
insert into School (id, name) values ('3','hilton');
insert into School (id, name) values ('4','melbourne girls');
create table Student(SchoolId int, UserId int);
insert into Student (SchoolId, UserId) values ('2','1');
insert into Student (SchoolId, UserId) values ('3','1');
insert into Student (SchoolId, UserId) values ('4','3');

AppUser 表是用户信息。School 表是学校信息。Student 表将学校与用户联系起来。我想选择“sashan”不在的所有学校。

我想出了这个:

select *
from School
left join Student
       on Student.SchoolId = School.Id
left join AppUser
       on AppUser.id = Student.userid
where AppUser.name is null
   or AppUser.name != 'sashan';

但是想知道是否有更好的方法。

如果您想重现该表并使用此问题中的代码测试 sql,请参阅http://www.sqlfiddle.com/

标签: sql

解决方案


你可以试试这个:

SELECT *
FROM   School
WHERE  id NOT IN (SELECT SchoolId
                  FROM   Student
                  JOIN   AppUser
                    ON   Student.UserId = AppUser.id
                   AND   name = 'sashan')

括号中的查询选择所有“sashan”所在的学校。
选择所有不属于这些学校的学校,你会得到你所要求的。


推荐阅读