问题描述
我想为下面定义的问题编写一个SQL查询,我的答案如下,但是我不确定答案,有人可以帮助我吗?答案是否正确?如果不正确,该如何改善?
让我们考虑以下有关医生和科室的关系模式:
-
PHYSICIAN
(PhysicianId,姓名,姓氏,专长,性别,出生日期,部门);让每个医生都可以通过代码唯一标识,并以姓名,姓氏,专业(我们假设要为每个医生准确记录一个专业),性别,出生日期和相关部门(每个医生)为特征被分配给一个部门,并且只有一个部门。
-
DEPARTMENT
(名称,建筑物,楼层,负责人)让每个部门的名称都可以唯一地标识出来,并以其位置(建筑物和楼层)和首长为特征。
让我们假设医师最多可以是一个部门(他/她所属的部门)的负责人。我们不排除两个不同的部门位于同一建筑物的同一层的可能性。
预先定义主键,其他候选键(如果有)和外键(如果有)。然后,制定一个SQL查询来计算以下数据(仅在严格需要聚合函数时才使用它们):
- 由男医生和女医生组成的部门,其医生都出生于1955年以后,也就是说,他们都至多64岁。
我的回答如下:
create view table X as {
select d.Name
from department d inner join PHYSICIAN p on
d.department=f.name
where gender="Female" and gender="Male and birthdate>1955
select *
from X
解决方法
您的查询将不返回任何记录,因为“性别”字段不能同时等于“女性”和“男性”。 我的建议是这样的:
select distinct d.*
from departments d
inner join physicians m on d.name = m.department and m.gender = 'Male'
inner join physicians f on d.name = f.department and f.gender = 'Female'
left join physicians o on d.name = o.department and p.birthdate < '1955-01-01'
where o.id is null
这个想法是每个部门至少要找到一名男性和一名女性。之后,为每个部门找到一个老人,并过滤掉所有拥有这个老人的部门。
,由于问题仅询问有关部门的问题,请考虑使用子查询,而不要加入医师表。此外,没有人可以同时是男性和女性(非二进制类别将是他们自己的类型),因此当前的逻辑会失败。
请考虑在相关查询中分别检查年龄和性别。汇总查询可以检查所有部门成员是否出生于1955年之后。
select d.Name
from department d
where d.name in
(select p.department from PHYSICIAN p where p.gender='Female')
and d.name in
(select p.department from PHYSICIAN p where p.gender='Male')
and d.name in
(select p.department
from PHYSICIAN p
group by p.department
having count(*) = sum(p.birthdate >= '1956-01-01'))