内部結合する時の結合条件と制約条件について
下記の例の場合の結合条件と制限条件の書き分けを
教えて下さい。
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で質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Visual Basic(VBA) エクセル VBA 条件付き書式 簡略化したい 2 2022/06/02 17:46
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- 化学 振動数条件と量子条件の説明なんですが、こんな感じでいいですか? 振動数条件: 式E2-E1=hν 内 2 2023/04/12 08:50
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関係演算子が無効です。
-
9iのSQL:1999構文を使用した外...
-
GROUP BYを行った後に結合した...
-
SELECTで1件のみ取得するには?
-
Excelで、改行がある場合の条件...
-
Oracleでの文字列連結サイズの上限
-
SQL文で右から1文字だけ削除す...
-
Accessで別テーブルの値をフォ...
-
ADO VBA 実行時エラー3021
-
SQLの書き方(チェックボックス)
-
実績累計の求め方と意味を教え...
-
OracleのSQL*PLUSで、デー...
-
アクセスでレポートの1印刷内...
-
Accessでのレコード存在チェック
-
CREATE テーブルでの複数外部...
-
oracleのinsert select性能
-
チェックボックスの項目をDBにi...
-
Access終了時の最適化が失敗?
-
キーが同じを複数行を1行にま...
-
select insertで複数テーブルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関係演算子が無効です。
-
SQL 外部結合についての質問
-
Excel VBAで、Averageの範囲を...
-
TO_CHAR関数における外部結合に...
-
同じテーブルをLEFT JOIN
-
自己相関サブクエリと自己結合...
-
LEFT JOINの条件式で=’’を使用...
-
Informixで文字列を数値型に
-
内部結合する時の結合条件と制...
-
Access 結合条件設定方法
-
T-SQL 動的に優先順ごとにデー...
-
WHERE句の書き方
-
エラー「無効な識別子です」
-
エクセルVBAでSUM関数の位置を...
-
Pro*CでVARCHAR2項目の検索
-
エラー2「無効な識別子です」
-
Oracle SQL 結合の手法について
-
【修正希望】【マクロ】元デー...
-
SQLで後方の文字列を置換する方法
-
range表記をcells表記にしたい
おすすめ情報