关于一道老题,请教两个问题。
原题为:
有如下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 经理职工号