我正在攻读我的数据库考试,该考试涵盖了我需要手工编写的大量SQL语句。下面是我的书中概述的2个场景的架构图和解决方案,这些场景对我来说似乎没有意义。
问题13:检索在ProductX项目中每周工作超过10小时的部门5中所有员工的姓名。
SELECT FNAME, LNAME
FROM EMPLOYEE,PROJECT, WORKS_ON
WHERE DNO = 5 AND PNAME = ‘PRODUCT X’ AND HOURS>10 AND ESSN=SSN;
WHERE 子句不应包含 PNO = NUMBER 吗? 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 :(得分: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:使用相关子查询。
答案 1 :(得分:1)
对于第一个问题,是的,你猜对了。应该有另一个条款 PNO = NUMBER 。
对于第二个问题,请以这种方式考虑:选择员工编号[Ssn] 在每个给定员工编号的子查询返回的 employeeIDs [Essn]列表中的员工[Ssn ]。这应该工作正常。但是,因为Essn和Dependent Name都是Dependent表的键,所以您也可以使用简单的join语句来完成它。在此处阅读:http://www.w3schools.com/sql/sql_join.asp
答案 2 :(得分: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