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

问题描述:

这是我遇到的问题。构建sql查询以从数据库检索特定数据

我有我正在试图为程序构建的查询。以下是查询:

  • 我需要在其部门控制的恰好一个项目上工作的员工的姓名。 (他们工作的非部门项目的数量并不重要,为了说明一个员工是否在自己的部门工作了一个以上的项目,我不想要这个结果,但他可以在他的部门工作1个项目,其他部门。我只想找谁正在研究仅1中来自该项目分配给部门项目的员工。)
  • 此外,我需要证明的部门名称,项目名称和位置。
  • 我想以升序字母顺序显示结果(按姓氏和名字),以便于阅读。

这里是我的表

  • employee表:FNAME,LNAME,SSN,出生日期,地址,DNO(部门编号)
  • project表:项目名称,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; 
+0

**绝对**告诉我们你做了什么!不要担心它不起作用 – 2014-10-10 21:47:12

+0

告诉我们你有什么 – 2014-10-10 21:48:31

+0

^[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08 /bad-habits-to-kick-using-old-style-joins.aspx) - 旧式*逗号分隔的表*样式列表被替换为ANSI中的* proper * ANSI'JOIN'语法* * 92 ** SQL标准(**超过20年**前),其使用不鼓励 – 2014-10-11 07:49:57

这样的事情?

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 

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 

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 

“在由他们的部门控制的恰好一个项目”

  • 正好一个项目可以由具有 COUNT(w.projectnumber)= 1
  • 来确定
  • 控制其部门是加入条件e.dno到p.dnum
+0

嘿非常感谢所有人的帮助。嘿,你们怎么知道所有这些东西?有没有我可以阅读的书或者我可以练习学习这些东西的教程?这些看起来非常复杂的查询。我刚刚开始sql。我花了几个小时工作,你们在几分钟内完成了。 – ramon 2014-10-10 22:17:54

+0

书籍仍然是最好的方式。试试这个:: Microsoft SQL Server 2012 T-SQL基础知识(开发人员参考)Itzik Ben-Gan(作者)在线有堆也尝试http://sqlzoo.net – 2014-10-10 23:10:40

所以我们需要做跨员工,项目和works_on联接。我们可以忽略部门,因为这不重要。下面是我认为会工作的查询:

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 
  • 在选择,我们做了COUNT(*)作为project_count所以我们可以指望他们是如何 很多项目工作。
  • 在其中,我们将 与连接的行匹配在一起。
  • 其中第3行确保我们只有 才能获得由其部门控制的项目。
  • 具有 子句是允许我们使用聚合函数指定 条件的一个非常重要的部分:此例中的count(*)project_count,在 中。

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

不确定您是否需要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