改善书面SQL查询

问题描述

我想为下面定义的问题编写一个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'))