5

受講しているデータベースコースの過去の論文を調べていますが、SQLの質問に悩まされています

提供されるスキーマは次のとおりです

  • 国(名前、首都、地域)、名前が鍵です

  • 国が国の名前を指す人々(国、人口、子供、大人)、人口は総人口、子供と大人は子供と大人の人口の割合です。

  • 言語(国、言語、パーセンテージ)–その国で話されている言語ごとに、その言語を話す人口のパーセンテージが一覧表示されます。

ここに質問があります:

SQLで次のクエリを記述します。総人口が10^7を超える国でのみ話されている言語を検索します。

これは私がこれまでに持っているものです:

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

私が少し混乱しているのは、言語が話されている国が他にないことを確認する方法ですが、人口は10^7未満です。

何かアドバイス?ありがとう

4

3 に答える 3

4

すべての言語を取得します。そのセットから、人口が10^7未満の国で話されているすべての言語を削除します。リマインダーは、人口が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つの国で話さなければならないという制限がデザインにあることに基づいて機能します;)

于 2012-04-10T21:12:25.980 に答える
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 );
于 2012-04-11T07:57:34.147 に答える
0

私のアプローチは、国の各サイズグループで話される個別の言語を取得し、それらの2つのリストを左に結合して、人口が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
于 2020-02-14T20:47:42.423 に答える