[英]improving the written sql query
我想为下面定义的问题编写一个 SQL 查询,我的答案如下,但我不确定答案,有人可以帮助我吗? 答案是否正确,或者如果不正确,我该如何改进?
让我们考虑以下关于医生和科室的关系模式:
医师(医师PHYSICIAN
、姓名、姓氏、专业、性别、出生日期、部门);
让每一位医生都由一个代码唯一地标识,并以姓名、专业(我们假设为每个医生准确记录一个专业)、性别、出生日期和相关部门(每个医生被分配到一个且只有一个部门)。
DEPARTMENT
(姓名、建筑物、楼层、主管)
让每个部门都由一个名称唯一标识,并以其位置(建筑物和楼层)和负责人为特征。
让我们假设一名医生最多可以担任一个部门(他/她所属的部门)的负责人。 我们不排除两个不同部门位于同一建筑物的同一楼层的可能性。
初步定义主键、其他候选键(如果有)和外键(如果有)。 然后,制定一个 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
您的查询不会返回任何记录,因为“性别”字段不能同时等于女性和男性。 我的建议是这样的:
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.