仅当每个元素都符合条件时才选择组

时间:2017-03-25 17:02:09

标签: mysql ms-access

我有这样简单的数据库方案:Child one----many SchoolPreferences

儿童表包括:

ChildId, Name, Surname, Age

SchoolPreferences包括:

PreferenceId, ChildId, PreferenceNumber, SchoolName

这是为了重新上学。每个孩子最多可以选择3所他们想去的学校。如果他们在PreferenceNumber 1中被接受,那么他们就会去 那所学校,如果他们不满足他们获得PreferenceNumber 2的条件,如果他们在那里失败,那么他们的最后一次机会是在第三优先学校。

我需要选择仅被选为PreferenceNumber 1的学校。因此,如果任何孩子选择学校作为PreferenceNumber 2或3,那么学校根本不应出现在结果中。

到目前为止,我只知道如何选择单个行,但我需要的是过滤组,因此每个学校都是一个组,如果有任何偏好> 1然后整个组不应出现在结果中。

到目前为止,我有这个,但正如我所说它只适用于个别行,而不是学校:

select SchoolPreferences.PreferenceId,
    Children.name,
    Children.Surname
from Children
inner join SchoolPreferences on Children.ChildId = SchoolPreferences.ChildId
group by SchoolPreferences.PreferenceId,
    Children.name,
    Children.Surname
having (((SchoolPreferences.PreferenceNumber) = 1));

1 个答案:

答案 0 :(得分:1)

反连接模式可以解决这个问题。不需要子表。看起来我们学校唯一的标识符是schoolname

如果我理解规范,请返回仅作为首选项1出现的学校列表(schoolname),并且不会显示为任何其他首选项...

这样的事情:

 SELECT p1.schoolname
   FROM SchoolPreferences p1
   LEFT
   JOIN SchoolPreferences pn
     ON pn.schoolname = p1.schoolname
    AND pn.preferencenumber <> 1
  WHERE pn.schoolname IS NULL
    AND p1.preferencenumber = 1
  GROUP
     BY p1.schoolname

还有其他查询模式返回等效结果,例如

 SELECT p1.schoolname
   FROM SchoolPreferences p1
  WHERE p1.preferencenumber = 1
    AND NOT EXISTS 
        ( SELECT 1
            FROM SchoolPreferences pn
           WHERE pn.schoolname = p1.schoolname
             AND pn.preferencenumber <> 1
        )
  GROUP
     BY p1.schoolname

如果我们想要将拥有该学校的孩子作为首选项1包含在内,我们会删除GROUP BY,并且我们可以加入Children

 SELECT p1.schoolname

      , p1.preferenceid
      , p1.childid
      , ch.name
      , ch.surname

   FROM SchoolPreferences p1

   JOIN Children ch
     ON ch.childid = p1.childid

   LEFT
   JOIN SchoolPreferences pn
     ON pn.schoolname = p1.schoolname
    AND pn.preferencenumber <> 1
  WHERE pn.schoolname IS NULL
    AND p1.preferencenumber = 1

  ORDER
     BY p1.schoolname
      , p1.childid