所以在这个问题上,我遇到了麻烦。 员工(fname,minit,lname,ssn,birthdate,address,sex,salary,superssn,dno)key:ssn DEPARTMENT(dname,dnumber,mgrssn,mgrstartdate)键:dnumber PROJECT(pname,pnumber,plocation,dnum)key:pnumber
这是我写的:
Select e.ssn, e.lname,e.fname,
From employee e,
where e.ssn in
(select s.ssn, s.lname,sfname
from employee s,
where s.superssn = e.ssn, AND s.lnamme='Wallace' s.fname ='Jennifer'
)
但我只得到了15分中的10分,我的教授说我的选择s.ssn,slname部分是错误的,它必须与我的e.ssn匹配#34;。我该如何解决这个问题?
答案 0 :(得分:1)
自我加入(同桌)。别名e
适用于工作人员,别名s
适用于主管。
select s.ssn, s.lname,s.fname,
From employee s
join employee e
on s.ssn=e.superssn
where e.lname='Wallace' and e.fname ='Jennifer'
答案 1 :(得分:1)
你的in语句会使这个查询变慢。你可以将它重构成一个像这样的自我加入
select e.ssn, e.lname, e.fname
from employee e
join employee s on s.superssn = e.ssn
where s.lnamme='Wallace' AND s.fname ='Jennifer';
你的in语句的问题是你正在创建一个从属子查询,它检查employee表中的每一行与同一个表中的每一行。
打破查询本身
select s.ssn, s.lname, s.fname -- s is the supervisor
from employee e -- e is jennifer
join employee s on s.superssn = e.ssn -- self join on the supervisors id is equal to the employees id
where e.lnamme='Wallace' AND e.fname ='Jennifer';
答案 2 :(得分:0)
使用IN
很好,但是使用相关子查询,EXISTS
是可行的方法:
Select s.ssn, s.lname, s.fname
From employee s
where exists (select 1
from employee e
where e.superssn = s.ssn AND
e.lname = 'Wallace' AND
e.fname = 'Jennifer'
);
注意:
s
和e
。您需要主管信息,因此它会进入外部查询。AND
已添加。使用IN
,它看起来像:
Select s.ssn, s.lname, s.fname
From employee s
where s.ssn IN (select e.superssn
from employee e
where e.lname = 'Wallace' AND
e.fname = 'Jennifer'
);
请注意,不需要关联子句。