1

我有一个关系 Presidents(firstName,lastName,beginTerm,endTerm),它提供有关美国总统的信息。属性 firstName 是一个带有名字的字符串,在某些情况下,一个或多个中间名首字母。

属性 lastName 是带有总统姓氏的字符串。例如,前任总统的 firstName = 'George W.' 他的父亲有 firstName = 'George HW'; 两者都有 lastName = 'Bush'。最后两个属性 beginTerm 和 endTerm 分别是总统进入和离开办公室的年份。

一个微妙之处是 Grover Cleveland 服务了 2 个不连续的术语。他出现在 2 个元组中,一个是他第一任期的开始和结束年份,另一个是第二任期。

我的问题如下:

总统有两对父子。但是还有许多其他总统对共享姓氏。查找属于 2 位或更多总统的所有姓氏。不要重复姓氏,并记住同一个人担任 2 个不同的任期(例如,格罗弗·克利夫兰)并不构成 2 位总统具有相同姓氏的情况。

我首先想到的答案可能是:

    SELECT lastName
    FROM Presidents
    WHERE COUNT(lastName) > 2
    EXCEPT lastName = 'Cleveland';

我不太确定 COUNT() 函数是否可以在 WHERE 子句中使用。这可能吗?

谢谢!

4

3 回答 3

9

检查组函数时使用 HAVING 而不是 WHERE。

SELECT lastName
FROM Presidents
WHERE lastName != 'Cleveland'
GROUP BY lastName
HAVING COUNT(lastName) > 2;

但是,在解决这样的 SQL 难题时,您永远不应该考虑实际数据。它应该适用于所有一致的数据集!我相信这是您问题的实际解决方案:

SELECT DISTINCT p1.lastName
FROM Presidents p1, Presidents p2
WHERE p1.lastName == p2.LastName
AND p1.firstName != p2.firstName;
于 2013-11-09T23:51:16.307 回答
2

您使用 约束聚合HAVING,并且还缺少分组依据。

SELECT lastName
FROM Presidents
where lastName <> 'Cleveland';
group by lastname
having COUNT(lastName) > 2
于 2013-11-09T23:51:33.527 回答
0

假设还有一个 id 字段,

select id, lastname, count(*) differentguycount
from presidents left join
(select id, firstname, lastname count(*) sameguycount
from presidents 
group by id, firstname, lastname
having sameguycount > 1 ) temp on temp.id = presidents.id
where temp.firstname is null
group by id, lastname 
having differentguycount > 1

如前所述,OP 没有指定可能导致语法错误的数据库引擎。例如,某些数据库可能不允许您在 having 子句中使用别名。

于 2013-11-10T00:12:28.037 回答