构建SQL查询以从数据库中检索特定数据

时间:2014-10-10 21:43:19

标签: sql

这是我遇到的问题。

我正在尝试为程序构建查询。这是查询:

  • 我需要处理由其部门控制的一个项目的员工姓名。 (他们工作的非部门项目有多少并不重要。要澄清一个员工是否在他自己的部门工作超过1个项目,那么我不想要结果。但他可以在他的部门工作1个项目以及其他部门。我只是在寻找那些只从事项目所在部门工作的员工。)
  • 此外,我还需要显示部门名称,项目名称和位置。
  • 我想以升序字母顺序显示结果(按姓氏和名字命名),以便于阅读。

这是我的表格

  • employee表:fname,lname,ssn,birthdate,address,dno(部门编号)
  • project表:projectname,projectnumber,plocation,dnum(部门编号)
  • works_on表:ssn,projectnumber,hours_worked
  • department表:dname,dnumber,managerssn,manager_start_date

这是我在工作几个小时后想出来的:

select distinct 
    employee.fname, 
    employee.lname, 
    employee.ssn, 
    employee.dno, 
    project.pnumber, 
    project.dnum
from 
    employee, works_on, project
where 
    employee.dno = project.dnum
    and project.pnumber = works_on.pno;

5 个答案:

答案 0 :(得分:0)

这样的事情?

select e.fname, e.lname, e.dno, p.projectname
from employees e
inner join projects p on p.projectnumber = e.project --OR HOWEVER THE 2 ARE LINKED
group by e.fname, e.lname, e.dno, p.projectname
having count(p.Projectnumber) = 1 
order by e.lname asc

答案 1 :(得分:0)

SELECT
  e.ssn as employee_ssn
  ,e.dno as employee_department_number
  ,wo.projectnumber
  ,p.projectname as project_name
  ,p.dnum as project_department_number
FROM employees e
JOIN works_on wo on wo.ssn = e.ssn
JOIN projects p on p.projectnumber = wo.projectnumber
WHERE e.dno = p.dnum

答案 2 :(得分:0)

SELECT
      e.fname
    , e.lname
FROM works_on w
      INNER JOIN employee e
                  ON w.ssn = e.ssn
      INNER JOIN project
                  ON w.projectnumber = p.projectnumber
                        AND e.dno = p.dnum
GROUP BY
      e.fname
    , e.lname
HAVING COUNT(w.projectnumber) = 1

“只有一个由他们部门控制的项目”

  • HAVING可以确定一个项目 COUNT(w.projectnumber)= 1
  • 他们的部门控制是连接条件e.dno到p.dnum

答案 3 :(得分:0)

因此我们需要在员工,项目和工作中进行联接。我们可以忽略部门,因为它并不重要。这是我认为可行的查询:

select fname, lname, dno, projectname, count(*) as project_count
from employee, project, works_on
where employee.ssn = works_on.ssn and
      works_on.projectnumber = project.projectnumber 
      project.dnum = employee.dno
having project_count = 1
  • 在select中,我们将count(*)作为project_count,因此我们可以计算如何计算 他们正在开展的许多项目。
  • 在哪里,我们匹配 连接的行。
  • 第3行的地方确保我们是 只能让他们的部门控制项目。
  • 有 子句是允许我们指定a的最重要的部分 使用聚合函数的条件:count(*)project_count,in 这种情况。

根据您使用的SQL引擎,HAVING子句的语法可能略有不同。

答案 4 :(得分:0)

不确定您是否需要GROUP BY,取决于您的意思"恰好是一个项目"。这应该非常接近:

select e.fname, e.lname, p.projectname, p.location, d.dname FROM
employee e
INNER JOIN works_on w
ON e.ssn = w.ssn
INNER JOIN project p
ON w.projectnumber = p.projectnumber
INNER JOIN department d
ON p.dnum = d.dnumber
WHERE e.dno = p.dnum
ORDER BY e.lname, e.fname