Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加查询中剩下的部分_Sql_Sql Server - Fatal编程技术网

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

我有五张桌子:

  • 老师 身份证件 名字

  • 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名教师和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代表学生注册的课程。每个表都在数字旁边,有两列