@ゲー単走部

ローグライク雑記。変愚蛮怒、DCSSなど。

内部結合と副問い合わせの違い

2つのテーブルがあるとする。

テーブルraces

+------+
| race |
+------+
| Mi   |
| DE   |
| Ce   |
+------+

テーブルbuilds

+------+------+------+
| race | job  | god  |
+------+------+------+
| Mi   | Tm   | Chei |
| Mi   | Fi   | Chei |
| Mi   | Mo   | Chei |
| Mi   | Gl   | Chei |
| Mi   | Be   | Trog |
| DE   | Cj   | Vehu |
| DE   | FE   | Vehu |
| DE   | EE   | Vehu |
| Sp   | En   | Gozag|
| Vp   | En   | Kiku |
| Fe   | Mo   | Kiku |
+------+------+------+

テーブルracesは何となく種族を並べたテーブルで、主キーは種族。というか主キーしかない。
テーブルbuildsは何となくプレイしそうなビルドを並べたもので、主キーは(race,job)で信仰は一つの(race,job)に対して一つにしている。

racesテーブルに書いてある種族のうち、Cheiに向いてそうな種族を抽出したい。

select races.race from races, builds
where races.race = builds.race and builds.god = 'Chei';

こう書くと2つのテーブルを結合した後に、Cheiにヒットするものを抽出する。結果はこうなる。

+------+
| race |
+------+
| Mi   |
| Mi   |
| Mi   |
| Mi   |
+------+

Miが一杯だ。テーブルbuildsとの結合に使ったキーraceがMiが4つあるからこうなってしまう。
distinct句を使うと一行だけ出力させられる。

副問い合わせを使うと最初から一行だけになる。

select races.race from races
where races.race in
    (select builds.race from builds where builds.god = 'Chei');