构建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;
这样的事情?
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
嘿非常感谢所有人的帮助。嘿,你们怎么知道所有这些东西?有没有我可以阅读的书或者我可以练习学习这些东西的教程?这些看起来非常复杂的查询。我刚刚开始sql。我花了几个小时工作,你们在几分钟内完成了。 – ramon 2014-10-10 22:17:54
书籍仍然是最好的方式。试试这个:: 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
**绝对**告诉我们你做了什么!不要担心它不起作用 – 2014-10-10 21:47:12
告诉我们你有什么 – 2014-10-10 21:48:31
^[踢坏的习惯:使用旧式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