1. ホーム
  2. mysql

[解決済み】SQL ZOO 各大陸とアルファベット順で1位の国名をリストアップする

2022-02-15 02:54:08

質問内容

なぜ、そうならないのか?

Select x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.name=y.name)
ORDER BY name

なぜ x.name=y.name ではなく x.continent=y.continent でなければならないのか、どなたか教えてください。

テーブル

解決方法は?

を使用した場合 x.name=y.name の場合、x の国名と y の国名を比較していることになります。この場合、基本的にはxのテーブル全体を返すことになります。

を使用したい。 x.continent=y.continent なぜなら、x のインスタンスの国名と y のインスタンスの国名を比較したいのは、それらが同じ大陸を共有している場合だけだからです。

例によって順を追って説明しましょう。 ここにテーブルworldがあり、いくつかのデータが入力されています。

world: 

Select  x.continent, x.name
From world x
ORDER BY  name

continent       name
Asia            Afghanistan
Europe          Albania
Africa          Algeria  
Europe          Andorra
Africa          Angola
SouthAmerica    Bolivia
SouthAmerica    Brazil
Europe          Hungary
Asia            Japan
Africa          Nigeria
SouthAmerica    Peru
Asia            Taiwan

サブクエリに WHERE 句を指定せずにこのクエリを実行した場合。

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y)
ORDER BY name

こうなる

continent   name
Asia        Afghanistan

これは、where節が1つの国を除くすべての国をフィルタリングしたためです。

where x.name <= (Afghanistan,Taiwan,Japan,
                 Albania,Hungary,Algeria,Nigeria,Andorra,
                 Angola,Bolivia,Peru,Brazil)

つまり、アルファベット順で最初に来る国名がアフガニスタンなのです。

の最初の国を取得したいのですが、そのためには 各大陸 を追加します。 x.continent=y.continent をサブクエリに追加します。

Select  x.continent, x.name
From world x
Where x.name <= ALL (select y.name from world y where x.continent=y.continent)
ORDER BY name

つまり、x のインスタンスの国名と y のインスタンスの国名を比較するのは、それらが同じ大陸を共有している場合のみということです。たとえば、アジア大陸とします。

Japen がフィルタリングされるのは Japan <= All(Afghanistan,Taiwan,Japan) 日本はアフガニスタンより小さいか等しくないので、偽です (A は J より前に来ます)

台湾がフィルタリングされるのは Taiwan <= All(Afghanistan,Taiwan,Japan) は偽です。台湾はアフガニスタンより小さいか等しくないからです。

アフガニスタンがフィルタリングされないのは Afghanistan <= All(Afghanistan,Taiwan,Japan) はアフガニスタンと等しいので真です

しかし、もし x.name=y.name というのは、すべての国名がそれ自身の国名と等しいからです。

私はこれが役立つことを願っています。この回答や他の回答があなたの問題を解決した場合、それをaccepted.quotとしてマークしてください。