仅当每个元素都满足条件时才选择组

Posted

技术标签:

【中文标题】仅当每个元素都满足条件时才选择组【英文标题】:Select group only if every element meets criteria 【发布时间】:2017-03-25 17:02:08 【问题描述】:

我有这样的简单数据库方案: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】:

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

如果我理解规范,请返回学校列表 (schoolname),该列表仅显示为偏好编号 1,而没有显示为任何其他偏好编号...

类似这样的:

 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

【讨论】:

以上是关于仅当每个元素都满足条件时才选择组的主要内容,如果未能解决你的问题,请参考以下文章

如果条件满足则选择 A 行,否则为每个组选择 B 行

仅当没有具有满足条件的值的行时才为列选择值

仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档

仅当满足特定条件时,JQuery 才会自动完成

仅当所有匹配条件都失败时才更新标志

仅当记录不存在时才将 SQL 插入表中[重复]