- ベストアンサー
INNER JOINについて
こんにちは、現在下のWEBでSQLの勉強をしているのですが・・・。 http://www.pursue.ne.jp/jouhousyo/SQLDoc/select21.html INNER JOINについて質問です。 FROM 表名1 INNER JOIN表名2 ON 表名1.フィールド名 = 表名2.フィールド名 このONというコマンド、これは連結するフィールド名を表しているのですよね?これは、無くてはならないコマンドでしょうか。例えば、このウェブの問題だと、売上表.顧客CD=顧客表.顧客CD をする事で、顧客CDがソートされ、同じものが連結されてます。 もし、顧客CDの値が、二つの表で異なった場合、異なった値は切り捨てられ、その行は融合されないと言う事ですよね? なら、例えば普通に二つの表の値を比べたい場合、例えば、 A表: 売り上げ総合、日付、顧客表 B表: 顧客名、売り上げA、売り上げB という表があったとして、表Bの売り上げレートを表Aの総売上で割り、書く平均値を出したい場合、 SELECT 表B.売り上げA / 表A.売り上げ総合, 表B.売り上げB / 表A.売り上げ総合 FROM 表A INNER JOIN 表B として、ONを使わなくても大丈夫でしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ダメです。 というか出来ますが 表Aの行数*表Bの行数分のデータが出来ます 表A 300行、表B 500行 なら検索結果は15000行です これは連結の基準がわからないので総当りの結果を作成するためです。 どちらかの表全てなら、left(right) outer join を使用します わからない場合は試してみるのが一番ですよ SELECT するだけなら問題ありません。
その他の回答 (1)
- chukenkenkou
- ベストアンサー率43% (833/1926)
>これは連結するフィールド名を表しているのですよね? リレーショナルDBでは、一般的に「結合」といい、「on」で結合条件を指定します。 >これは、無くてはならないコマンドでしょうか。 一般的に、結合条件を指定しないというケースは、殆どないと思います。結合条件がないと、「直積」になってしまいます。例えば、表1に10件、表2に20件の行があれば、「inner join」の結果は、10×20=200件になります。 >このウェブの問題だと、売上表.顧客CD=顧客表.顧客CD をする事で、顧客CDがソートされ、同じものが連結されてます。 顧客CDがソート?何を言いたいのでしょうかね? そういった内容は、書かれていないようですが? それにソートされるかどうかは、RDBMSの内部処理で、どうなるか分かりません。 >顧客CDの値が、二つの表で異なった場合、異なった値は切り捨てられ、その行は融合されないと言う事ですよね? 「inner join」ですから、結合条件で合致しない行は、捨てられます。 対応しない行も取り出したい場合は、「outer join」を使う必要があります。 >ONを使わなくても大丈夫でしょうか? 列名が、ころころ変わっていますね。 何をやりたいのか不明ですが、前述の通り、結合条件がないと直積になってしまいます。 質問中のurlの内容は、「結合条件を指定しない」ことについては、何ら書かれていないようですが、何を勘違いしているのでしょうかね?
お礼
>顧客CDがソート あ、これは私の間違いです。条件指定で、ONによって、同じ値段同士の顧客CDが融合された形という意味でした。 Outer Joinのコマンドについては知りませんでした。勉強してみたいと思います。質問中のURLには条件指定が書いてなかったようなので、条件指定しないと、そのまま表同士がくっつく事になるのかな?と想像してました。 直積という認識が無かったのだと思います。はい、思いっきり勘違いです。(汗)でもこれで、はっきりしました。有難うございました!
お礼
総当りの結果になってしまうんですか・・・なるほど、解りました。 これは知らなかったので、やってみようと思います。