我有一个关系Presidents(firstName,lastName,beginTerm,endTerm),提供有关美国总统的信息.属性firstName是具有名字的字符串,在某些情况下,是一个或多个中间名字首字母.
属性lastName是一个包含总统姓氏的字符串.例如,前任总统有firstName ='George W.' 他的父亲有firstName ='George HW'; 两者都有lastName ='Bush'.最后两个属性beginTerm和endTerm分别是总统进入和离职的年份.
一个微妙之处在于Grover Cleveland提供了2个不连续的术语.他出现在2个元组中,一个是第一个学期的开始和结束年份,另一个是第二学期.
我的问题如下:
有两对父亲和儿子的总统.但是还有许多其他总统都有一个姓氏.查找属于2位或更多位总统的所有姓氏.不要重复使用姓氏,并记住,服务于2个不同术语的同一个人(例如,Grover Cleveland)不构成具有相同姓氏的2位总统的情况.
我首先想到答案可能是:
SELECT lastName
FROM Presidents
WHERE COUNT(lastName) > 2
EXCEPT lastName = 'Cleveland';
Run Code Online (Sandbox Code Playgroud)
我不太确定COUNT()函数是否可以在WHERE子句中使用.这可能吗?
谢谢!
在检查组功能时使用HAVING而不是WHERE.
SELECT lastName
FROM Presidents
WHERE lastName != 'Cleveland'
GROUP BY lastName
HAVING COUNT(lastName) > 2;
Run Code Online (Sandbox Code Playgroud)
但是,当解决SQL-puzzles喜欢这个时,你永远不应该考虑实际的数据.它应该适用于所有一致的数据集!我相信这是您问题的实际解决方案:
SELECT DISTINCT p1.lastName
FROM Presidents p1, Presidents p2
WHERE p1.lastName == p2.LastName
AND p1.firstName != p2.firstName;
Run Code Online (Sandbox Code Playgroud)