Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改进编写的sql查询_Sql_Database_Rdbms - Fatal编程技术网

改进编写的sql查询

改进编写的sql查询,sql,database,rdbms,Sql,Database,Rdbms,我想为下面定义的问题编写一个SQL查询,我的答案如下,但我不确定答案,有人能帮我吗?答案正确吗?如果不正确,我如何改进 让我们考虑以下关于医师和部门的关系模式: 医师ID、姓名、姓氏、专业、性别、出生日期、科室 让每一位医生都由一个代码进行单音识别,并以姓名、姓氏、专业为特征。我们假设每位医生只记录一个专业、性别、出生日期和相关科室。每位医生被分配到一个科室 部门名称、大楼、楼层、主管 让每个部门都有一个名称,并以其位置、建筑和楼层以及负责人为特征 让我们假设一位医生最多可以是他/她所属的一个科

我想为下面定义的问题编写一个SQL查询,我的答案如下,但我不确定答案,有人能帮我吗?答案正确吗?如果不正确,我如何改进

让我们考虑以下关于医师和部门的关系模式:

医师ID、姓名、姓氏、专业、性别、出生日期、科室

让每一位医生都由一个代码进行单音识别,并以姓名、姓氏、专业为特征。我们假设每位医生只记录一个专业、性别、出生日期和相关科室。每位医生被分配到一个科室

部门名称、大楼、楼层、主管

让每个部门都有一个名称,并以其位置、建筑和楼层以及负责人为特征

让我们假设一位医生最多可以是他/她所属的一个科室的主任。我们不排除两个不同部门位于同一大楼同一楼层的可能性

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

有男医生和女医生的科室,他们的医生都是1955年以后出生的,也就是说,他们都最多64岁。 我的答覆如下:

将视图表X创建为{ 选择d.名称 从d部门内部加入医生p d、 部门名称 其中性别=女性,性别=男性,出生日期>1955年 挑选* 从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

P< >为每个部门至少找到一个男性和一个女性,然后为每个部门找到一个老人并筛选出所有有这样一个老人的部门。

< P>因为问题只要求部门考虑使用子查询而不加入医生的表格。另外,在SA中没有人可以是男性和女性。时间非二进制类别将是它们自己的类型,因此当前逻辑失败

考虑在相关查询中分别检查年龄和性别。聚合查询可以检查所有部门成员是否在1955年之后出生

选择d.名称 来自d部门 d.name在哪里 从医师p中选择p.department,其中p.gender='Female' 和d.name 从医师p中选择p.department,其中p.gender='Male' 和d.name 选择体育部 来自医生p 体育部分组 拥有计数*=出生日期>='1956-01-01'
我不明白这部分,为什么我们需要检查两次医生的姓名,性别为男性和女性?检查是否与having子句中的计数检查相似?谢谢,我能问一下这部分在做什么吗?having count*=SHOUP.BIRTHATE>='1956-01-01'前两个子查询检查科室是否至少有一名医生在eit中她的性别。最后一个子查询检查是否所有1955年以后出生的医生。count*返回所有行的计数和sum…求和该逻辑的True=1。如果该科室的所有医生都是1955年以后出生的,则等于该科室的所有医生。我已将查询更新为使用科室名称。还请注意,此查询未使用任何aggrega虽然@Parfait的答案包含计数函数,但它与您的问题需求相矛盾。