
内部結合する時の結合条件と制約条件について
下記の例の場合の結合条件と制限条件の書き分けを
教えて下さい。
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自己相関サブクエリと自己結合...
-
関係演算子が無効です。
-
Accessで日付が変わると番号が...
-
ADO VBA 実行時エラー3021
-
Oracleでの文字列連結サイズの上限
-
OracleのSQL*PLUSで、デー...
-
GROUP BYを行った後に結合した...
-
ACCESSの集計クエリで3件ある...
-
ACCESSで大量の更新を行うと「...
-
ADOでエクセルからアクセス...
-
PHP+MySQL
-
Excelで、改行がある場合の条件...
-
oracleの分割delete
-
キーが同じを複数行を1行にま...
-
Accessで別テーブルの値をフォ...
-
Access終了時の最適化が失敗?
-
ACCESSのクエリで同じSQL文だが...
-
エクセルのピボットテーブルの...
-
データセットのレコード更新が...
-
SQL GROUPで件数の一番多いレコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL 外部結合についての質問
-
関係演算子が無効です。
-
エラー2「無効な識別子です」
-
エラー「無効な識別子です」
-
自己相関サブクエリと自己結合...
-
LEFT JOINの条件式で=’’を使用...
-
SQLで後方の文字列を置換する方法
-
TO_CHAR関数における外部結合に...
-
【修正希望】【マクロ】元デー...
-
パフォーマンスを考慮したSQL文...
-
range表記をcells表記にしたい
-
Excel VBAで、Averageの範囲を...
-
エクセルVBAでSUM関数の位置を...
-
SQL 文字列検索につきまして
-
同じテーブルをLEFT JOIN
-
Oracle SQL 結合の手法について
-
INNER JOINとwhere句
-
9iのSQL:1999構文を使用した外...
-
内部結合する時の結合条件と制...
-
2つのSQL(Access)の結果[時刻,...
おすすめ情報