繁体   English   中英

改进编写的 sql 查询

[英]improving the written sql query

我想为下面定义的问题编写一个 SQL 查询,我的答案如下,但我不确定答案,有人可以帮助我吗? 答案是否正确,或者如果不正确,我该如何改进?

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

  • 医师(医师PHYSICIAN 、姓名、姓氏、专业、性别、出生日期、部门);

    让每一位医生都由一个代码唯一地标识,并以姓名、专业(我们假设为每个医生准确记录一个专业)、性别、出生日期和相关部门(每个医生被分配到一个且只有一个部门)。

  • 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'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM