[解決済み】SQL ZOO 各大陸とアルファベット順で1位の国名をリストアップする
質問内容
なぜ、そうならないのか?
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としてマークしてください。
関連
-
[解決済み】autoカラムは1つしか存在できない
-
[解決済み】MySQLのエラーコードです。MySQL WorkbenchでUPDATE中に1175のエラーが発生しました。
-
[解決済み] MySQLで日付のみのパラメータを使用してタイムスタンプの日付を比較する方法は?
-
[解決済み] エラーコードです。1215. 外部キー制約を追加できません (外部キー)
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] 各グループの上位1行を取得
-
[解決済み】SQL Server 既存テーブルへのSELECT。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MySQLユーザーDBにパスワードカラムがない - OSXへのMySQLインストール
-
[解決済み】mysqld_safe UNIX ソケットファイル用のディレクトリ '/var/run/mysqld' が存在しません。
-
[解決済み] ONLY_FULL_GROUP_BYの無効化
-
[解決済み] MySQLで週単位でグループ化する方法は?
-
[解決済み] whereステートメントによるmysqlの一括更新
-
[解決済み] MySQLです。テーブルを作成できません (errno: 150)
-
[解決済み] SQL エラー - テーブルの定義が正しくありません; auto カラムは 1 つしか存在できません。
-
[解決済み] エラー1022 - 書き込みできません; テーブルに重複したキーがあります。
-
[解決済み] dpkg: error processing package mysql-server (dependency problems)?
-
[解決済み] DEFAULT NULLとCHECKBOX NULL mysqlの違いは何ですか?