Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
希望通过连接3个表在sql中使用count函数_Sql_Oracle - Fatal编程技术网

希望通过连接3个表在sql中使用count函数

希望通过连接3个表在sql中使用count函数,sql,oracle,Sql,Oracle,我想回答这个问题: 打印由不同部门和项目经理控制的项目总数 我使用下面的查询 select a.dname as "Departement", b.fname as "Manager", c.pname as "Project" , c.dnum from "DEPARTMENT " a , "EMPLOYEE " b , "PROJECT " c where a.dnumber = c.dnum and a.mgr_ssn = b.ssn ; 我只想添加count函数

我想回答这个问题:

打印由不同部门和项目经理控制的项目总数

我使用下面的查询

select a.dname as "Departement", b.fname as "Manager", c.pname as "Project" , c.dnum
from "DEPARTMENT " a ,
     "EMPLOYEE " b ,
     "PROJECT " c
where a.dnumber = c.dnum
  and a.mgr_ssn = b.ssn ;

我只想添加count函数来返回每个经理控制的项目数

首先,这不是连接表的方式,至少从90年代初开始是这样

然后,您希望每个部门和经理都有一行,而不管他们关联了多少个项目;这意味着您需要按这两个字段分组。另一个信息是项目行的聚合,正如您所说,您需要的聚合是计数

您的最终查询应该如下所示

select  a.dname as "Departement",
        b.fname as "Manager",
        count(distinct c.pname) as "ProjectsCount"
from    DEPARTMENT a
join    EMPLOYEE b
on      a.mgr_ssn = b.ssn
join    PROJECT c
on      a.dnumber = c.dnum
group by a.dname, b.fname

前面的答案和这个答案都假设没有两个项目具有相同的名称-项目表上是否有唯一的键

select a.dname as Departement, 
       b.fname as Manager, 
       c.pname as Project, 
       c.dnum,
       count(distinct d.pname)
from DEPARTMENT a,
     EMPLOYEE b,
     PROJECT c,
     PROJECT d
where a.dnumber = c.dnum
  and a.mgr_ssn = b.ssn
  and a.dnumber = d.dnum
group by a.dname, 
         b.fname, 
         c.pname, 
         c.dnum;
这是你的问题

   select a.dname as Department, b.fname as Manager, count(c.pname) as Project, c.dnum
     from DEPARTMENT  a 
     join EMPLOYEE    b on a.mgr_ssn = b.ssn 
     join PROJECT     c on a.dnumber = c.dnum 
     group by a.dname,b.fname,c.dnum

提示:当你阅读总数,计数将涉及,也可能由一组。谁教你加入那样应该考虑放弃…显式连接是当今的标准提示:切换到现代的显式连接语法。更易于编写,无错误,更易于阅读和维护,并且在需要时更易于转换为外部联接。如果需要此功能,请选择a.dname作为部门,b.fname作为经理,c.pname作为项目,c.dnum从部门a加入员工b在b.ssn=a.mgr\u ssn加入项目c在c.dnum=a.dnumber;sql99称之为有效,这也是许多DBA(包括我自己)仍然是如何连接表的,尽管我担心表名中的隐含空格。不客气,很高兴它有帮助@布莱恩纽曼你为什么使用这种连接?我只看到这方面的缺点……在SQL 2016中,旧的隐式连接仍然有效,但这不是使用它的借口。在这种情况下,我真的考虑从整个查询中删除双引号。旧习惯…我花了好几年的时间才转向现代、明确的加入,但现在我再也不会回去了!