内部結合する時の結合条件と制約条件について
下記の例の場合の結合条件と制限条件の書き分けを
教えて下さい。
table1:
no|type
---------
1| A
2| B
3| C
4| A
5| C
table2:
no|type|name|locale
-------------------
1| A |ネコ| ja
2| B |イヌ| ja
3| C |トリ| ja
4| A |cat | en
5| B |dog | en
6| C |bird| en
取得したいデータ:
no|type|name
-------------
1| A |ネコ
2| B |イヌ
3| C |トリ
4| A |ネコ
5| C |トリ
SQL:
SELECT t1.no, t1.type, t2.name
FROM table1 t1
INNER JOIN table2 t2
ON t1.type=t2.type
AND t2.locale='ja'
または
SELECT t1.no, t1.type, t2.name
FROM table1 t1
INNER JOIN table2 t2
ON t1.type=t2.type
WHERE t2.locale='ja'
となると思うのですが、
t2.locale='ja'の条件は
結合条件とするのと制限条件とするのとで
違いがあるのでしょうか?
もし違いがない場合はどちらが一般的でしょうか?
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
次の四つ書き方があります。
(結果同じ)SELECT
t1.no ,
t1.type ,
t2.name
FROM table1 t1
INNER JOIN table2 t2
ON t1.type = t2.type
AND t2.locale = 'ja'
/
SELECT
t1.no ,
t1.type ,
t2.name
FROM table1 t1
INNER JOIN table2 t2
ON t1.type = t2.type
where t2.locale = 'ja'
/
SELECT
t1.no ,
t1.type ,
t2.name
FROM table1 t1 ,
table2 t2
where t1.type = t2.type
and t2.locale = 'ja'
/
SELECT
t1.no ,
t1.type ,
t2.name
FROM table1 t1 ,
( select
no ,
name
from table2
where locale = 'ja'
) t2
where t1.type = t2.type
SQLの実行効率面を考えれば、この前の三つは同じです、最後の書き方は一番速いです。
SQL実行ログを参照してください(table1とtable2の十万件のレコードがあるケースを例とする)。
----- VISUAL SQLTOOL 実行 Log ------------
14:25:48:875 SQL: SELECT ... [ 行 1 - 8 ]
->: 100000 件 0.203秒
14:25:49:140 SQL: SELECT ... [ 行 11 - 18 ]
->: 100000 件 0.203秒
14:25:49:421 SQL: SELECT ... [ 行 21 - 28 ]
->: 100000 件 0.203秒
14:25:49:656 SQL: SELECT ... [ 行 31 - 40 ]
->: 100000 件 0.187秒
参考URL:http://japan.werunsoft.com/tips.aspx?db=oracle&i …
回答ありがとうございます。
実行効率の面からの解説をしていただき、
大変勉強になりました。
質問の例にある書き方はどちらも実行効率は変わらないが
インラインビューを利用した方がパフォーマンスが良いという事でしょうか。
記述方法が複数ある場合、実行効率を調査して選ぶというのも
良い方法ですね。参考になりました。
ありがとうございました。
No.1
- 回答日時:
結合時に評価されるか(ON)
結合後に評価されるか(WHERE)
の違いがあります。
内部結合の場合、結果セットに違いは生じませんが、
外部結合の場合、結果セットが違ってくるので注意が必要です。
# 外部結合で試してください。面白いですよ。
内部結合の場合、
どちらが一般的かは
私には答えられません。
# 何が普通か
# 何が一般的か
# 現場によって変わります。
回答ありがとうございます。
お礼が遅れてしまい、申し訳ありません。
内部結合の場合であれば、結果に差異はなく
どちらを選ぶかは現場の状況に合わせて、という事ですね。
>結合時に評価されるか(ON)
>結合後に評価されるか(WHERE)
この表現が大変分かりやすかったです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TO_CHAR関数における外部結合に...
-
関係演算子が無効です。
-
2つのSQL(Access)の結果[時刻,...
-
Informixで文字列を数値型に
-
同じテーブルをLEFT JOIN
-
こういう場合のSQLの書き方。
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
ADO VBA 実行時エラー3021
-
select insertで複数テーブルか...
-
GROUP BYを使ったSELECT文の総...
-
Excelで、改行がある場合の条件...
-
Accessで別テーブルの値をフォ...
-
Access 文字+年ごとの自動採番
-
あるカラムのMAX値+1をINSERTし...
-
キーが同じを複数行を1行にま...
-
【MYSQL】asでリネームしてwher...
-
MERGE文を単体テーブルに対して...
-
実績累計の求め方と意味を教え...
-
複数テーブルのMAX値の行データ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関係演算子が無効です。
-
SQL 外部結合についての質問
-
Excel VBAで、Averageの範囲を...
-
エクセルVBAでSUM関数の位置を...
-
同じテーブルをLEFT JOIN
-
エラー2「無効な識別子です」
-
LEFT JOINの条件式で=’’を使用...
-
自己相関サブクエリと自己結合...
-
TO_CHAR関数における外部結合に...
-
【修正希望】【マクロ】元デー...
-
PL/SQLの質問です。
-
Pro*CでVARCHAR2項目の検索
-
sessionのtime zoneのデフォル...
-
SQLで後方の文字列を置換する方法
-
Informixで文字列を数値型に
-
Oracle SQL 結合の手法について
-
2つのSQL(Access)の結果[時刻,...
-
range表記をcells表記にしたい
-
Access 結合条件設定方法
-
エラー「無効な識別子です」
おすすめ情報