MYSQL 数据库混乱
MYSQL database confusion
所以在这个问题上,我遇到了麻烦。
EMPLOYEE(fname,minit,lname,ssn,birthdate,address,sex,salary,superssn,dno) key:ssn
部门(名称、编号、mgrssn、mgrstartdate)key:dnumber
项目(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分,教授说我的select s.ssn,slname部分错了,一定是"match my e.ssn"。我应该如何解决这个问题?
一个自连接(相同table)。 Alias e
是工作人员,alias 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'
您的 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 语句的问题是您正在创建一个依赖子查询,它检查员工 table 中的每一行以及相同 table 中的每一行。
分解查询本身
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';
使用 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
被交换了。您需要 supervisor 信息,所以它进入外部查询。
- 多余的逗号已被删除。
- 已添加
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'
);
请注意,不需要关联子句。
所以在这个问题上,我遇到了麻烦。 EMPLOYEE(fname,minit,lname,ssn,birthdate,address,sex,salary,superssn,dno) key:ssn 部门(名称、编号、mgrssn、mgrstartdate)key:dnumber 项目(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分,教授说我的select s.ssn,slname部分错了,一定是"match my e.ssn"。我应该如何解决这个问题?
一个自连接(相同table)。 Alias e
是工作人员,alias 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'
您的 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 语句的问题是您正在创建一个依赖子查询,它检查员工 table 中的每一行以及相同 table 中的每一行。
分解查询本身
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';
使用 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
被交换了。您需要 supervisor 信息,所以它进入外部查询。 - 多余的逗号已被删除。
- 已添加
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'
);
请注意,不需要关联子句。