【问题标题】:How to solve these two Queries?如何解决这两个查询?
【发布时间】:2013-09-03 21:02:18
【问题描述】:

我是 SQL 新手,我有一个家庭作业。我做对了所有问题,但仍然无法弄清楚这两个问题,所以如果可以,请提供帮助。提前感谢您。

我有四张桌子:

EMPLOYEE which conatin the attributes (Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn, Dno)

Table DEPARTMENT have the columns ( Dname, Dnumber, Mgr_ssn, Mgr_start_date)

Table PROJECT have the columns ( Pname, Pnumber, Plocation, Dnum)

Table DEPENDENT (Essn, Dependent_name, Sex, Bdate, Relationship)

第一季度。对于控制项目数量最多的部门,请列出其名称? 我提出了这个查询,但它仍然只给了我每个部门它控制的项目数量,但不能让它发挥作用,因为只给了我最多的一个:(

SELECT Dname, COUNT(distinct Pnumber) as NumberOfProjects
FROM Department, Project
WHERE Dnum = Dnumber
GROUP BY Dname;

第二季度。检索比任何其他员工拥有更多家属的员工的姓名和 Ssn?

我想出了这个,但不知道为什么它不起作用。我不断收到错误

SELECT Fname, Lname, Ssn
FROM Employee
WHERE max((SELECT COUNT(*)
        FROM Dependent
        WHERE Ssn = Essn));

顺便说一句,我使用的是 MySql WorkBench 5.2,语言只是允许使用的 SQL

【问题讨论】:

  • @Rahul Tripathi 非常感谢您的编辑 :)
  • 您使用三个不同的 DBMS 系统标记了您的问题。你用的是哪一个?

标签: mysql sql sql-server sqlite tsql


【解决方案1】:

对于您的第一个查询,如果您已经拥有所有部门的列表以及他们控制的项目数量,那么您的工作就完成了。在您的查询中添加一些额外的代码来完成这项工作。

如果您按项目数量降序排列,则正确的部门将排在列表的首位。如果你 LIMIT 1,你只会选择那个部门。


您的第二个查询需要做更多的工作,它没有像第一个查询那样清晰地提供您要查找的信息。重复同样的技巧,先按顺序获取信息,然后寻找最上面的。您的内部查询可能看起来像这样:
(SELECT Essn, COUNT(Dependent_name) AS Dependents
 FROM Dependent
 GROUP BY Essn
 ORDER BY Dependents DESC);

【讨论】:

    【解决方案2】:

    您可以将此查询用于 Q1:

        SELECT * FROM(
        SELECT Dname, COUNT(distinct Pnumber) as NumberOfProjects
        FROM Department, Project
        WHERE Dnum = Dnumber
        GROUP BY Dname
    ORDER BY COUNT(distinct Pnumber) desc nulls last)
    LIMIT 1
    

    【讨论】:

      【解决方案3】:

      您可以将此查询用于 Q2:

      SELECT Fname, Lname, Essn FROM(
          SELECT Essn,  Fname, Lname, COUNT(Dependent_name) as NumberOfDependents
          FROM Dependent, Employee
          WHERE Essn = Ssn
          GROUP BY Essn
      ORDER BY NumberOfDependents desc)
      LIMIT 1
      

      如果您使用上面的子查询运行它,这是低效的,因为您在提取具有最大值的员工之前加入了 2 个大表 Dependent 和 Employee。家属。但它会起作用的!

      【讨论】:

      • 子查询并不是低效的,它们就像查询的投影,你可以通过查看子查询的执行计划来检查这一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多