改进书面 sql 查询
improving the written sql query
我想为下面定义的问题写一个SQL查询,我的答案如下,但我不确定答案,谁能帮助我?答案是否正确,如果不正确,我该如何改进?
让我们考虑以下关于医生和科室的关系模式:
PHYSICIAN
(PhysicianId, Name, Surname, Specialization, Gender, BirthDate, Department);
让每个医生都由一个代码唯一标识,并以姓名、姓氏、专业(我们假设为每个医生准确记录一个专业)、性别、出生日期和相关科室(每个医生都被分配到一个部门。
DEPARTMENT
(姓名、建筑、楼层、主管)
让每个部门都由一个名称明确标识,并以其位置(建筑物和楼层)和负责人为特征。
假设一名医师最多可以担任一个科室主任(he/she所属科室)。我们不排除两个不同的部门位于同一栋楼的同一层的可能性。
初步定义主键、其他候选键(如果有)、外键(如果有)。然后,制定一个 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
您的查询不会 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'))
我想为下面定义的问题写一个SQL查询,我的答案如下,但我不确定答案,谁能帮助我?答案是否正确,如果不正确,我该如何改进?
让我们考虑以下关于医生和科室的关系模式:
PHYSICIAN
(PhysicianId, Name, Surname, Specialization, Gender, BirthDate, Department);让每个医生都由一个代码唯一标识,并以姓名、姓氏、专业(我们假设为每个医生准确记录一个专业)、性别、出生日期和相关科室(每个医生都被分配到一个部门。
DEPARTMENT
(姓名、建筑、楼层、主管)让每个部门都由一个名称明确标识,并以其位置(建筑物和楼层)和负责人为特征。
假设一名医师最多可以担任一个科室主任(he/she所属科室)。我们不排除两个不同的部门位于同一栋楼的同一层的可能性。
初步定义主键、其他候选键(如果有)、外键(如果有)。然后,制定一个 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
您的查询不会 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'))