日期:2014-05-18  浏览次数:20357 次

关于一道老题,请教两个问题。
原题为:
有如下2个关系表

Emp(eid,ename,age,did,salary),其各列含义为:职工号,姓名,年龄,部门号,工资

Dept(did,dname,mgr_id),其各列含义为:部门号,部门名称,部门经理职工号

写出一条SQL语句,查询工资大于10000,且与他所在部门的经理年龄相同的职工姓名。

答案给出的是:
SQL code
Select  a.*  from  Emp a, Dept b,Emp c Where  a.did=b.did  and  b.mgr_ id=c.eid  and  a.salary>10000  and  a.age=c.age



有两个问题,第一,怎么理解语句中两次使用了Emp这个表,两次使用的分别起什么作用?第二,这两个表设计合理吗,emp的主码是eid,外码是did,而Dept中主码是did,外码是mgr_id,两个表的主码和外码互相依赖,创建表时不就无法定义约束吗?请高手指教。

------解决方案--------------------
Emp a --获取职工相关信息(虚拟职工表)
Emp c --获取经理相关信息(虚拟经理表)

a.age = c.age 两表判断年龄相同.

------解决方案--------------------
你的第二个问题:

你可以问自己这样一个问题,如果你来设计这个表的话,你会怎么设计,注意你的表必须反映下面3个字段的对应关系:

部门号,部门名称,部门经理职工号

1. 不用部门经理职工号可以吗?
2. 或者另外创建其它的表可以达到这种目的吗?
3. 可以减少或增加字段来达到部门和经理之间的映射关系吗

想了上面的问题后,你在想一想,上面的表合理吗?
合理吗,不合理吗?
不合理吗?合理吗?
。。。。。。。
------解决方案--------------------
如果觉得不想这么设计,那么大可以加一个关系表,来确定部门和职员之间的经理关系

职员表 有外键部门id

部门表 去掉 经理职工号字段

关系表 部门id 经理职工号