内部結合と副問い合わせの違い
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');