sql - 选择不在使用多个连接语句创建的表中的行
问题描述
我有这样的架构:
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/
解决方案
你可以试试这个:
SELECT *
FROM School
WHERE id NOT IN (SELECT SchoolId
FROM Student
JOIN AppUser
ON Student.UserId = AppUser.id
AND name = 'sashan')
括号中的查询选择所有“sashan”所在的学校。
选择所有不属于这些学校的学校,你会得到你所要求的。
推荐阅读
- amazon-web-services - 如果我不想访问 Internet,是否需要在 VPC 中使用 NAT 网关和路由表?
- ubuntu-18.04 - 带有 MPICH 致命错误的 OpenFOAM:mpi.h:没有这样的文件或目录
- python - Qt Drag & Drop 不适用于自定义项目
- java - 如何解决:使用 JdbcTemplate.query(RowMapper;)Ljava/util/List; 容易受到 SQL 注入的攻击(使用 Spring JDBC)
- kubernetes - kubectl : --dry-run 已弃用,可以替换为 --dry-run=client
- java - 如何使用具有三个参数的收集方法,即“收集(供应商,累加器,组合器)”在列表中添加整数
- android - 有没有办法使用带有标头的 API 和 API KEY 使用 Volley 来开发 Android 应用程序?
- security - 使用 fastcgi 缓存时在 NGINX 中添加安全标头
- algorithm - DFS 是否为未加权的有向图生成 MST?
- php - Laravel cURL 错误 6:无法解析主机:oauth