SQL oracle: 需要显示查询。

SQL oracle: Need to display a query.

所以我有 3 个表link编在一起,分别命名为 office、employee 和 dependent。

办公室:Oid (PK),办公室名称

员工:EID(PK)、Fname、Lname、JobTitle、薪水、DOH、性别、DOB、OID(FK1)、主管(FK2)

家属:DID(PK)、Fname、Lname、性别、EID(FK1)

这是表格图片的 link: http://classweb2.mccombs.utexas.edu/mis325/class/hw/hw12a.jpg

我需要显示受抚养人数最多的 5 名员工的姓名和 EID,如果最大的 5 名员工并列,那么我需要显示所有并列的员工。

我对如何开始感到困惑。请帮忙 :) 提前谢谢你

嗯,我会尝试这样的事情:

Select TOP 5
a.FNAME,
a.LNAME,
a.EID,
Count(b.EID) as Dependents
FROM employee a
LEFT JOIN dependent b on a.EID = b.EID
group by 1,2,3 order by Dependents desc

简单分解问题:

一个 EID 有多少家属:

SELECT EID, COUNT(*) AS C
FROM Dependent
GROUP BY EID

添加排名

SELECT EID, C, RANK() OVER (ORDER BY C DESC)
FROM (
  SELECT EID, COUNT(*) AS C
  FROM Dependent
  GROUP BY EID
) S

我们想要前 5 个

SELECT EID 
FROM (
  SELECT EID, C, RANK() OVER (ORDER BY C DESC) AS R
  FROM (
    SELECT EID, COUNT(*) AS C
    FROM Dependent
    GROUP BY EID
  ) S
) S2
WHERE R <= 5

现在问你想要什么:

SELECT * -- or whatever
FROM Employee 
WHERE EID IN (
  SELECT EID 
  FROM (
    SELECT EID, C, RANK() OVER (ORDER BY C DESC) AS R
    FROM (
      SELECT EID, COUNT(*) AS C
      FROM Dependent
      GROUP BY EID
    ) S
  ) S2
  WHERE R <=5
) S3

我建议你 运行 每一步并确保它给你预期的结果。