rub*_*ube 2 mysql sql database
City_Name (PK) State_Name (PK) Population
-------------- --------------- ----------
Austin MA
Austin TX
Burlington VT
Fresno CA
Houston TX
Independence KS
Independence MO
Independence PA
Kansas CA
Kansas MO
Paris MO
Paris OR
Paris TX
Paris VA
Paso TX
Run Code Online (Sandbox Code Playgroud)
上表有一个复合主键(City_Name和State_Name).我想找到至少在两个不同国家发生的城市.在这种情况下,结果将是
City_Name
---------
Austin
Independence
Kansas
Paris
Run Code Online (Sandbox Code Playgroud)
其他城市不符合条件,因为它们不会出现在至少两个州.
该解决方案是练习关系演算问题所必需的,因此(不幸的是)不能使用诸如COUNT()之类的聚合函数.我浏览了一本数据库书,在那里我看到了类似问题的解决方案,看起来像这样,但没有用.
SELECT c1.State_Name FROM City AS c1
JOIN City AS c2 on c1.City_Name = c2.City_Name AND c1.State_Name = c2.State_Name
JOIN City AS c3 on c1.City_Name = c3.City_Name AND c1.State_Name = c3.State_Name
WHERE (c2.City_Name<>c3.City_Name) AND (c2.State_Name<>c3.State_Name);
Run Code Online (Sandbox Code Playgroud)
在这一点上一些帮助将非常欢迎.
您可以使用COUNT(DISTINCT)并使用HAVING子句限制结果:
SELECT City_Name, COUNT(DISTINCT State_Name)
FROM City
GROUP BY City_NAME
HAVING COUNT(DISTINCT State_Name) > 1
Run Code Online (Sandbox Code Playgroud)
请参阅COUNT(DISTINCT)的文档
返回具有不同非NULL expr值的行数.
我忽略了无法使用COUNT()的限制.这确实导致了自我加入:
SELECT
DISTINCT c1.City_Name
FROM
City c1
INNER JOIN
City c2
ON
c1.City_Name = c2.City_Name
AND
c1.State_Name <> c2.State_Name
Run Code Online (Sandbox Code Playgroud)
演示两种解决方案.
如果您不能使用任何类型的聚合函数,那么以下将返回至少出现两次的城市
SELECT distinct c1.city_name
FROM `city` c1
JOIN city c2
ON c1.city_name=c2.city_name
AND c1.state_name!=c2.state_name
Run Code Online (Sandbox Code Playgroud)
我假设不仅 COUNT 而且任何类型的聚合都不可用
| 归档时间: |
|
| 查看次数: |
1256 次 |
| 最近记录: |