2016-11-16 148 views
0

我正在为我的数据库考试学习,其中涵盖了许多我需要手写的SQL语句。下面是我的书中概述的两种情景的架构图和解决方案,这些方案对我来说似乎没有意义。你可以向我解释这2个SQL查询吗?

enter image description here

Q13:检索所有员工的部门5谁每周工作超过10小时的项目了ProductX的名字。

SELECT FNAME, LNAME 
FROM EMPLOYEE,PROJECT, WORKS_ON 
WHERE DNO = 5 AND PNAME = ‘PRODUCT X’ AND HOURS>10 AND ESSN=SSN; 

不应该WHERE子句包括PNO = NUM​​BER?如何知道WORKS_ON表参考PROJECT表中没有包括这个?是因为我们引用了ESSN = SSN?

Q1:检索具有相同名字且与雇员性别相同的受抚养人的每名雇员的姓名。

SELECT E.FNAME, E.LNAME 
FROM EMPLOYEE AS E 
WHERE E.SSN IN (SELECT D.ESSN FROM DEPENDENT AS D WHERE E.FNAME = D.DEPENDENT_NAME AND D.SEX = E.SEX); 

我明白此查询一路上扬,直至WHERE子句。我不明白什么E.SSN IN正在尝试处理它之前的子查询。如果有人能解释这一点,那会很好。

+0

切勿使用逗号连接语法。并参见相关与非相关的子查询。 – Strawberry

+0

你使用的是MySQL还是MS SQL Server? (不要标记不涉及的产品。) – jarlh

回答

1

对于第一个问题,是的,你猜对了。应该有另一个条款PNO = NUM​​BER

对于第二个问题,认为它是这样的:选择一个员工,其中员工号[SSN] 是在 employeeIDs [ESSN]由子查询每个给定的员工号[SSN]返回的列表。这应该很好。但是,因为Essn和Dependent Name都是Dependent表的关键字,所以还可以使用简单的连接语句并完成它。请阅读此处:http://www.w3schools.com/sql/sql_join.asp

+0

同样地:http://meta.stackoverflow.com/questions/280478/why-not-w3schools-com – Strawberry

+0

感谢您的启发@Strawberry –

1

对于Q13:你需要在一个条件WHERE子句告诉Works_on项目,这是

SELECT FNAME, LNAME 
FROM EMPLOYEE,PROJECT, WORKS_ON 
WHERE Pno = Pnumber AND DNO = 5 AND PNAME = ‘PRODUCT X’ AND HOURS>10 AND ESSN=SSN; 

Q1之间的关系:使用相关子查询

0
SELECT E.FNAME, E.LNAME 
FROM EMPLOYEE E 
INNER JOIN WORKS_ON WO 
ON WO.Essn = E.Ssn 
INNER JOIN PROJECT P 
ON P.Pnumber = WO.Pno 
where E.DNO = 5 
and P.name = 'ProductX' 
and WO.Hours > 10 
相关问题