我正在阅读过去一篇关于我正在学习的数据库课程的论文,我被困在一个SQL问题上
这是提供的架构
国家(名称,资本,地区),名称是关键
国家指的人(国家,人口,儿童,成人) 国家名称,人口是总人口,儿童和成人 是儿童和成年人口的百分比。
语言(国家,语言,百分比) - 针对每种语言 国家/地区,它列出了说该语言的人口百分比。
以下是问题:
在SQL中编写以下查询:查找总人口超过10 ^ 7的国家/地区只使用 的语言。
这是我到目前为止所做的:
SELECT l.language
FROM people p, language l
WHERE l.country = p.country AND
p.population > 10^7
我感到困惑的是如何检查没有其他国家使用某种语言,但人口不足10 ^ 7.
有什么建议吗? 感谢
答案 0 :(得分:4)
获取所有语言。从该集合中删除人口<= 10 ^ 7的国家/地区使用的所有语言。提醒应该是仅在人口> gt的国家/地区使用的语言。 10 ^ 7。
select language from languages
where language not in (
select language from languages l
join people p on l.country = p.country
where p.population <= 10^7)
这是基于您的设计限制每个语言必须至少在一个国家/地区使用;)
答案 1 :(得分:1)
WITH T
AS
(
SELECT l.language,
p.country, p.population
FROM people p, language l
WHERE l.country = p.country
)
SELECT language
FROM T
EXCEPT
SELECT language
FROM T
WHERE population <= 10000000;
可替换地:
SELECT language
FROM language AS l1
WHERE 10000000 < ( SELECT MIN(p.population)
FROM people p, language l
WHERE l.country = p.country
AND l.language = l1.language );
类似地:
SELECT language
FROM language AS l1
WHERE 10000000 < ALL ( SELECT p.population
FROM people p, language l
WHERE l.country = p.country
AND l.language = l1.language );
答案 2 :(得分:0)
我的方法是获取每个规模组的国家/地区使用的不同语言,然后左加入这两个列表,最后得出仅在人口大于10 ^ 7(或10000000)的国家/地区使用的语言列表
;WITH Bigs AS
(
SELECT DISTINCT l.language
FROM people p
INNER JOIN language l ON l.country = p.country
WHERE p.population > 10000000
)
,Littles AS
(
SELECT DISTINCT l.language
FROM people p
INNER JOIN language l ON l.country = p.country
WHERE p.population <= 10000000
)
SELECT b.language
FROM Bigs b
LEFT JOIN Littles l ON l.language = b.language
WHERE l.language IS NULL