SQL如何选择至少出现两次的实体

时间:2019-01-30 03:07:34

标签: sql

在“子程序”关系的“出勤”列中,分别有1和0,分别表示存在和不存在。如何选择缺席至少2次的学生? (对于这种情况,汉娜和乔阿什)。被选中的学生将显示在“电子邮件”中。

ChildProgram relation

This is the output of what is needed

SELECT DISTINCT Concat('Dear Mr and/or Mrs ', C.lastname, 
                ', we are writing concerning your child’s attendance. ', 
                C.firstname, ' was absent from the subject ', CP.programid, 
                ' for at least 2 lessons.') 'Content of Email' 
FROM   child C, 
       childprogram CP 
WHERE  C.firstname = CP.firstname 

1 个答案:

答案 0 :(得分:1)

您可以为此使用GROUP_BY HAVING

SELECT C.EMAIL, C.LAST_NAME, C.FIRST_NAME, COUNT(*) as DAYS_OFF
FROM CHILD C
JOIN CHILDPROGRAM CP
ON C.FIRSTNAME = CP.FIRSTNAME
WHERE ATTENDANCE = 0
GROUP BY C.LAST_NAME, C.FIRST_NAME
HAVING COUNT(*) > 1

显然可以根据需要更改选择,但这将为您提供缺席的名称和天数,并且只包括缺席超过一天的孩子。

另一方面,使用FIRSTNAME作为孩子的钥匙有明显的问题(您不能处理2个同名孩子)。我不确定您拥有多少控制权,但可能结合使用电子邮件和名字会更好。这也意味着在CHILDPROGRAM表上也有EMAIL。那或者只是创建一个ID字段,您可以将其用作外键。