Sql 添加查询中剩下的部分
我有五张桌子:Sql 添加查询中剩下的部分,sql,sql-server,Sql,Sql Server,我有五张桌子: 老师 身份证件 名字 Ct 工业贸易署 CID 课程 身份证件 名字 钢筋混凝土 希德 CID 学生 身份证 名字 桌子在号码旁边。我已经写了一个查询,在下面查找教师id、教师姓名、学生id和学生姓名: select a.ID,a.name, c.SID,d.Name from teacher a join ct b on a.ID = b.TID JOIN rc c on B.CID = C.CID JOIN student D on c.SID = D.ID 有500
select a.ID,a.name, c.SID,d.Name
from teacher a
join ct b on a.ID = b.TID
JOIN rc c on B.CID = C.CID
JOIN student D on c.SID = D.ID
有500名教师和2500名学生。300名教师在授课,2000名学生在上课。我想把不在教学的老师和不在上课的学生也包括在内。不在第一个查询中的那些实际上正在进行研究。如何创建一个查询来包含当前未包含的其他查询?首先,使用合理的表别名编写查询,以便更易于阅读。那么,我认为最简单的解决方案可能是:
with ts as (
select t.ID, t.name, s.ID as sid, s.Name as sname
from teacher t join
ct
on t.ID = ct.TID join
rc
on rc.CID = ct.CID join
student s
on rc.SID = s.ID
)
select ts.*
from ts
union all
select t.id, t.name, null, null
from teacher t
where not exists (select 1 from ts where ts.id = t.id)
union all
select null, null, s.id, s.name
from student s
where not exists (select 1 from ts where ts.sid = t.sid);
您可以使用left join
s消除其中一个union all
。您可以使用左连接
和完全连接
来消除这两种情况:
select t.ID, t.name, s.ID as sid, s.Name as sname
from teacher t left join
ct
on t.ID = ct.TID left join
rc
on rc.CID = ct.CID full join
student s
on rc.SID = s.ID ;
这也行得通。但是,如果您想以任何方式过滤结果,我发现
union all
版本更易于调整。ct表格代表教授的课程,rc代表学生注册的课程。每个表都在数字旁边,有两列