改进书面 sql 查询

improving the written sql query

我想为下面定义的问题写一个SQL查询,我的答案如下,但我不确定答案,谁能帮助我?答案是否正确,如果不正确,我该如何改进?

让我们考虑以下关于医生和科室的关系模式:

假设一名医师最多可以担任一个科室主任(he/she所属科室)。我们不排除两个不同的部门位于同一栋楼的同一层的可能性。

初步定义主键、其他候选键(如果有)、外键(如果有)。然后,制定一个 SQL 查询来计算以下数据(仅在绝对必要时才使用聚合函数):

我的回答如下:

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

您的查询不会 return 任何记录,因为 'gender' 字段不能同时等于 Female 和 Male。 我的建议是这样的:

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

我们的想法是为每个部门至少找到一名男性和一名女性。然后每个部门找一个老人,过滤掉所有有这样一个老人的部门。

由于问题仅询问有关部门,请考虑使用子查询而不加入医生 table。此外,任何人都不能同时是男性和女性(non-binary 类别将是他们自己的类型),因此当前逻辑失败。

考虑在相关查询中分别检查年龄和性别。聚合查询可以检查 所有 部门成员是否出生在 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'))