Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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_Oracle - Fatal编程技术网

Sql 要按计数筛选的查询

Sql 要按计数筛选的查询,sql,oracle,Sql,Oracle,鉴于这些表格: Employee(ssn, name, sex, address, salary, bdate, dno, superssn) fk:superssn is ssn in Employee fk:dno is dnumber in Department Department(dnumber, dname, mgrssn, mgrstartdate) fk:mgrssn is ssn in Employee Dept_locations(dnumber, dlocation)

鉴于这些表格:

Employee(ssn, name, sex, address, salary, bdate, dno, superssn)
fk:superssn is ssn in Employee
fk:dno is dnumber in Department

Department(dnumber, dname, mgrssn, mgrstartdate)
fk:mgrssn is ssn in Employee

Dept_locations(dnumber, dlocation)
fk:dnumber is dnumber in Department

Project(pnumber, pname, plocation, dnum)
fk:dnum is dnumber in Department

Dependent(essn, dependent_name, sex, bdate, relationship)
fk: essn is ssn in Employee

Works_on(essn,pno,hours)
fk: essn is ssn in Employee; pno is pnumber in Project
我需要检索每个部门的名称以及有两个地点的部门经理的姓名

到目前为止,我有这个问题

SELECT D.dname, D.mgrssn
FROM department D, dept_locations DL
WHERE D.dnumber = dl.dnumber
Group by D.dname, D.mgrssn
我现在得到三个不重复的部门。我如何将此限制到有两个地点的部门

select dname, name
from Department, Employee, Dept_locations
where mgrssn = ssn
and Department.dnumber = Dept_locations.dnumber
最好使用
内部联接
(或者干脆使用
联接
)而不是
WHERE
,来联接相关的表。请注意与上一个查询的差异。两者都将返回相同的结果:

SELECT D.dname, D.mgrssn
FROM Department D
    JOIN Dept_locations DL
        ON D.dnumber = DL.dnumber
GROUP BY D.dname, D.mgrssn
HAVING COUNT(*) >= 2          
如果还希望显示经理的姓名,则还必须加入Employee表(并相应地分组):


仅针对两个位置:

SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) = 2)
SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) >= 2)
对于两个或多个位置:

SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) = 2)
SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) >= 2)
牢记
DEPARTMENT
表有一个
mgrstrate
,因此您需要对照它进行检查——我提供的两个示例将向您展示除当前经理之外的所有历史经理,因为在
mgrstrate

“real quick please”=家庭作业上没有过滤功能。谢谢您的编辑工作,哈哈,当我看到它时,我看到它是多么可怕>\u你应该尝试使用
groupby
have
。想想你的查询现在会返回什么(没有
和…
,删除它)。对于每个有3个位置的部门,它将返回3行。每个部门有一个位置,一行。因此,您必须“按部门分组”,以将部门的所有行聚集到一行中(如果需要,可以对它们进行计数)。这是处理多行数据的常用方法。oooo谢谢:D:D我想我现在可以拿到了:D每个位置都有一行,有一个重复的部门。如果你需要在这些位置使用自定义函数,但我怀疑你的老师告诉你如何使用它们。这样就可以了。@Joel:每个部门都有一个经理。请参阅表definitions.DEPARTMENT有一个
mgrstartdate
,因此从历史角度来看,有多个经理关联。此外,ANSI-89和ANSI-92内部联接语法生成相同的查询计划;为了外部连接,最好使用ANSI-92语法。@OMG:同意连接。然而,这是家庭作业,所以这不是更好的计划或最佳实践的问题,而是按照老师的话(这应该与最佳实践的话相同…@OMG:关于经理的起始日期,我猜每个部门只有一个经理(当前经理)。