如何在SQL中编写“独占”查询?

时间:2012-04-10 20:56:51

标签: sql database join

我正在阅读过去一篇关于我正在学习的数据库课程的论文,我被困在一个SQL问题上

这是提供的架构

  • 国家(名称,资本,地区),名称是关键

  • 国家指的人(国家,人口,儿童,成人) 国家名称,人口是总人口,儿童和成人 是儿童和成年人口的百分比。

  • 语言(国家,语言,百分比) - 针对每种语言 国家/地区,它列出了说该语言的人口百分比。

以下是问题:

  
    

在SQL中编写以下查询:查找总人口超过10 ^ 7的国家/地区只使用 的语言。

  

这是我到目前为止所做的:

SELECT l.language
FROM people p, language l
WHERE l.country = p.country AND
    p.population > 10^7

我感到困惑的是如何检查没有其他国家使用某种语言,但人口不足10 ^ 7.

有什么建议吗? 感谢

3 个答案:

答案 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