2つのテーブルを(内部)結合させる場合、
INNER JOINによる結合と
WHERE句に結合条件を記述する2通りの方法が
あると思いますが、どちらが早いのでしょうか?

なお、Oracle9i、ルールベースにて構築されています。
テーブルの内容、SQL文は下記のとおりです。

ご教授よろしくお願いします。

■表 A
項目A-1 ・・・PRIMARY KEY1、INDEX1
項目A-2 ・・・PRIMARY KEY2、INDEX2
項目A-3 ・・・PRIMARY KEY3
項目A-4

■表 B
項目B-1 ・・・PRIMARY KEY1、INDEX1
項目B-2 ・・・PRIMARY KEY2、INDEX2
項目B-3 ・・・PRIMARY KEY3
項目B-4

※項目A-1と項目B-1にて結合。
 項目A-2が"01"と等しいレコード。

表Aのレコード件数>表Bのレコード件数


【WHERE句にて結合】
SELECT * FROM A,B
where A.項目1 = B.項目1
and A.項目2 = '01'

【INNER JOINにて結合】
SELECT * FROM A
INNER JOIN A
ON A.項目1 = B.項目1
AND A.項目2 = '01'

このQ&Aに関連する最新のQ&A

A 回答 (3件)

表定義の見方がよくわかりませんが、PRIMARY KEYを3つのカラムに設定している時点でインデックスは死んでしまっているような気がするのですが。



結合方法をWHERE句に記述してもINNER JOINを使用しても実行計画が変わることはないようです。

ただし、LEFT JOIN, RIGHT JOINを使用した場合は強制的にコストベースになるので注意が必要です。

また、FROM句でA, Bの順に記述されていますが、A.項目2 = '01'の条件で絞り込んでも、まだ

Aの件数 > Bの件数が成り立つのでしょうか?

もし、これで逆転するようなら、A.項目2にインデックスを作成し、FROM句をB, Aとした方が性能がよくなるように思われます。

ちなみに、ご存知かも知れませんが、ルールベースがサポートされているのは9iまでで、10gからは完全に廃止されています。
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

お礼日時:2005/04/25 10:56

オプティマイザは、マイナーバージョンでも変更されると聞きますし、


COMPATIBLE 初期パラメータでも、変動します。
どちらが高速かは、わかりませんが。
(+)演算子の未来も暗そうなので、WHEREで結合条件を書くのは控えて
INNER JOIN で書いていった方が将来明るいと思います。

どうしても調べたいならば、TRACEすれば個別のケースでは優劣は付くかもしれませんが
それで、100%の正解にはならないと思います。

あと、#2さんの指摘に加えて、
どのようなパターンだとしても(複合でも単独でも)、インデックスが冗長のように見えます。
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

お礼日時:2005/04/25 10:54

説明に出てくる”PRIMARY KEY1”、”PRIMARY KEY2”の意味がわかりません。


複数項目で設定したプライマリキーの第一項目、第二項目の意味でしょうか?
INDEX1,INDEX2も不明ですが..

【WHERE句にて結合】と【INNER JOINにて結合】の違いは、
従来型の記述か、ANSI構文かの違いなので、
それによる速度差は無いのではないかと思いますが、
実行計画を見ないと確かなことは言えません。
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ありません。
ご指摘ありがとうございました。

お礼日時:2005/04/25 10:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語キーボードが使えて高性能なネットブック

英語キーボードが使えて高性能なネットブックを探しています。
・必須条件
2Kg未満、RAM2GB以上、解像度1024x768以上、10万円または$1000未満
・できれば欲しい条件
デュアルコア、高機能Video、DVDドライブ内臓、OSは無/XP/7
自分で探した範囲では、「HP Pavilion dv2z(L625)の米国版」、「ASRock Multibook G22(Prime Note Cresion NAの元?)」等がありました。
Q1. これらは、日本で入手可能でしょうか?(HPの米国サイトではNGでした)
Q2. 英語キーボードつきまたは交換可能な他の候補が何かありますでしょうか?
Q3. その他何か良い方法や裏技、情報(そのうち○社から出るなど)をご存知であればお教えください。

Aベストアンサー

回答が得られないのは必須条件を満たす市販製品が見当たらないからだと思われ
ます.かろうじて Lenovo ThinkPad X200s 200 台限定 Model で英語 Keyboard
+ 2GB RAM, XPpro Downgrade 付で \100,905 です↓
http://shopap.lenovo.com/SEUILibrary/controller/e/jpweb/LenovoPortal/ja_JP/systemconfig.runtime.workflow:LoadRuntimeTree?sb=:000000AD:00000136:&smid=09E202623C724E77B3580608BB1C1392
もしくは \86,100 で VISTA Home Premium → Win7 優待 Upgrade ですか.

後は Dell Inspiron Mini12 だと 2GB RAM BTO 不可(1GB RAM のみ)で
条件外です(英語 Keyboard,予算,重量,解像度,OS は満たすが)
BTO で英語 Keyboard があるのは Dell と Lenovo しか私は知りません.
価格的には欲しい条件の殆どは満たせないのが現実と思われます.

回答が得られないのは必須条件を満たす市販製品が見当たらないからだと思われ
ます.かろうじて Lenovo ThinkPad X200s 200 台限定 Model で英語 Keyboard
+ 2GB RAM, XPpro Downgrade 付で \100,905 です↓
http://shopap.lenovo.com/SEUILibrary/controller/e/jpweb/LenovoPortal/ja_JP/systemconfig.runtime.workflow:LoadRuntimeTree?sb=:000000AD:00000136:&smid=09E202623C724E77B3580608BB1C1392
もしくは \86,100 で VISTA Home Premium → Win7 優待 Upgrade ですか.

後は Dell Inspiron Mini12 だ...続きを読む

QWHERE句はJOIN結合前結合後どちらに効くのか

以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。
先に抽出して結合した方が良いと昔聞いた事がありましたが
記憶があいまいになってしまいました。

(1)
SELECT *
FROM A JOIN B
ON A.*** = B.***
WHERE A.*** = '0001'

(2)
SELECT *
FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B
ON A.*** = B.***

Aベストアンサー

>以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。
>先に抽出して結合した方が良いと昔聞いた事がありましたが

ルールベースの場合の話かも知れません(9i以前なら使用可能)
コストベースオプティマイザを使用すると、内部結合のON条件とWHERE句とを同等に解析してくれるので、特に書き方来る性能差はないと考えればよいです。

(1)と(2)についてですが、「実行計画」をそれぞれ表示して比べてみてください。autotraceもよいですね。おそらく同じような結果が出ると思うのですが、基本的には(2)のような書き方はあまりすべきではありません。コストベースオプティマイザによる最適実行計画立案を妨げる恐れがある書き方だと思います。(もっと複雑なSQLだと、特に)
常に(1)のような書き方を心がけ、ベストの実行計画が出にくい場合にヒント句で調整するのが一番よい方法です。

Q英語OSでのIME日本語変換

日本語の漢字変換への性能がすごく悪いのですが、何か改善する方法があればアドバイス下さい。日本語版officeは海外在住で手に入らない為、それ以外の方法を教えて頂ければ幸いです。
環境;
WindowsXP(英語版)SP3
officeXP(英語版)
IMEスタンダード2002

Aベストアンサー

ATOKなら、体験版もあるし、DL販売もしてます。

http://www.atok.com/

又、OFFICE 2007には試用版があり、Office IME 2007も含まれています。
(WORD等の本体ソフトは試用版なので使用制限が存在するが、IME2007には制限が無い。)

http://trial.trymicrosoftoffice.com/trialjapan/default.aspx?re_ms=oo&culture=ja-JP
http://trial.trymicrosoftoffice.com/trialjapan/licensing.aspx?culture=ja-JP
http://trial.trymicrosoftoffice.com/trialjapan/setupinfo.aspx?culture=ja-JP

http://www.forest.impress.co.jp/article/2008/10/17/ime2007update.html


まぁ、個人的にはATOK派なので、ATOKをお勧めするけど。

ATOKなら、体験版もあるし、DL販売もしてます。

http://www.atok.com/

又、OFFICE 2007には試用版があり、Office IME 2007も含まれています。
(WORD等の本体ソフトは試用版なので使用制限が存在するが、IME2007には制限が無い。)

http://trial.trymicrosoftoffice.com/trialjapan/default.aspx?re_ms=oo&culture=ja-JP
http://trial.trymicrosoftoffice.com/trialjapan/licensing.aspx?culture=ja-JP
http://trial.trymicrosoftoffice.com/trialjapan/setupinfo.aspx?culture=ja-JP

http://www...続きを読む

QLEFT JOINの条件式で=’’を使用した場合

以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、
なぜか上手く取得できません。

ご存知の方がいらっしゃいましたら、教えてください。


-- SQL1 ---------------------------------------------------

select
  MAIN.MAIN_NAME,
  nvl(SUB1.CODE is NULL, 0) as SUB_CODE1,
  nvl(SUB2.CODE is NULL, 0) as SUB_CODE2
from
  MAIN_TABLE MAIN
   left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE
                   and SUB1.ZYOUKEN = '1'    (1)
   left join SUB_TABLE SUB2 on MAIN.CODE = SUB2.CODE
                   and SUB2.ZYOUKEN = ''     (2)
where
  MAIN.CODE = 'XXX'

-----------------------------------------------------------

質問1.
どうも、(2)の部分を空文字(?)ではなく何か値を入れると正常に1件
取得できるようなのですが、なぜ外部結合しているにもかかわらず
0件になってしまうのかが良く分かりません。

質問2.
やはり条件に空文字を使用するのはよろしくないでしょうか?



※補足
念のため、以下のSQLを実行したところ、こちらは問題なく1件取得
できているので、抽出条件は間違っていないです。

-- SQL2 ---------------------------------------------------

select
  MAIN.MAIN_NAME
from
  MAIN_TABLE MAIN
where
  MAIN.CODE = 'XXX'

-----------------------------------------------------------


以上です。宜しくお願いします。

以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、
なぜか上手く取得できません。

ご存知の方がいらっしゃいましたら、教えてください。


-- SQL1 ---------------------------------------------------

select
  MAIN.MAIN_NAME,
  nvl(SUB1.CODE is NULL, 0) as SUB_CODE1,
  nvl(SUB2.CODE is NULL, 0) as SUB_CODE2
from
  MAIN_TABLE MAIN
   left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE
                   and SUB1.ZYOUKEN = '1'    (1)
 ...続きを読む

Aベストアンサー

autotrace あたりで自分の意図したとおりのものになっているか確認してみてはどうでしょう?

WHERE句が指定されているので、実行計画が等価結合に書き換わっちゃっている可能性があります。

昔、これではまったことがあるので
僕は外部結合するときはWHEREは指定しないようにして
ON句で条件を指定するようにしています。
# 個人的にはバグじゃないかと思うんだけど仕様らしい。

たとえば、
WHERE句の条件を(1)あたりに追加してみてうまくいくようならこのケースかなと。

Q英語の長文の課題

私の行っている大学の英語の授業の課題が、教科書で2枚ほどの長文を訳して来いというものなんですが、私ははっきり言って英語が大の苦手で、ちょっと難しい文になるとちんぷんかんぷんになってしまいます。授業と課題についていけず、性能がいい翻訳ソフトを買おうと思ったんですが、あまり性能がいい翻訳ソフトは無い様で困ってしまいました。最も長文の訳しのサポートをしてくれる物ってなんなんでしょうか?教えてくださいお願いします。

Aベストアンサー

最も長文の訳しのサポートをしてくれるものはあなたです。
なにも課題はあなたの自由時間を束縛するために出されているのではなく、意味があって先生は出しています。
翻訳ソフトに逃げていると、ますます英語が苦手になります。
翻訳ソフトに逃げるのではなく、むしろ課題を踏み倒して野郎的な心構えをしてみてはどうでしょうか。私のように。



と、このままでは回答になっていない回答として通報されてしまいますので、あくまでアドバイスをば。

まず、訳してみる。
わけの分からない、これは絶対に訳せない! というものだけ、gooで聞いてみる。
ただ、「この文を訳してください」と言うのではなく、「that以下のtoが何を指定しているのか分かりません」など、具体的に。回答率も上がります。

英語は死ぬまでついてきます。がんばってください。

Qupdate文におけるwhereとjoinの違いについて

はじめまして。
副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。

使用しているDBはORACLE10gです。
SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。
ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。
whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのかがわかりません。
どなたかご教示いただけないでしょうか。

【1】
UPDATE SALARY
SET SALARY.AMOUNT = SALARY.AMOUNT +
(SELECT AMOUNT FROM EMPLOYEES INNER JOIN SALARY s ON EMPLOYEES.EMPLOYEEID = s.EMPLOYEEID)

【2】
UPDATE SALARY
SET SALARY.AMOUNT = SALARY.AMOUNT +
(SELECT AMOUNT FROM EMPLOYEES WHERE SALARY.EMPLOYEEID = EMPLOYEES.EMPLOYEEID)

説明不足の点があればご指摘ください。よろしくお願いします。

はじめまして。
副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。

使用しているDBはORACLE10gです。
SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。
ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。
whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのか...続きを読む

Aベストアンサー

これは明らかに結論が逆です。
【1】は失敗し、【2】は正しく更新されます。

【2】はいわゆる「相関副問い合わせ」なっており、副問い合わせの中でUPDATEの対象のSALARYテーブルを参照しています。したがって、SALARY1行につき正しくAMOUNTが1つ選択され、正しく更新されます。

一方、【1】は単なる「副問い合わせ」であり、副問い合わせの中のSALARYは更新対象となるSALARYとは別のテーブルと見なされています。
だから複数行が返ってエラーになります。
(おそらくこのケースではJOINを使った書き換えはできないのでは)

Q本番測定を英語で何ていいますか?

ある無線機器の無線性能の測定をします。
試作品でトライアル測定をして、量産試作品で本番測定します。
トライアル測定は英語でtrial mesurementでいいかと思いますが、
本番測定は英語で何と表現すればいいか教えてください。

Aベストアンサー

「トライアル測定」と「本番測定」と云う日本語の内容を考え直してください。
トライアル測定=試作品に付いての測定(真剣で真面目な、記録も残る)。
本番測定=量産試作品に付いての測定(真剣で真面目で記録が残り、ユーザーにも報告される、
場合に依っては保証データともなる)。トライアルだから、測定が問題なく行くか測定してみようでは無いわけです。
本番だから、さあこれが終われば商品でお金を頂けますよと言うわけでもありません。
要するに「測定」です。「試作品」と「量産試作品」に付いての。
この点を念頭に置かれて、trial measurement 的な、補足説明が無いと判らない様な表現以外の表現を見つけてください。
ちなみに、コメントは
practical measurement = ???
オフィシャルトライアル=スキー滑降競技の本番前の公式コースを使った公式練習。
actual measurement =? 回答者はお気付きの様ですが。

現場で何気なく使っている言葉の翻訳では、まず日本語の吟味が必要です。

QLEFT JOINとRIGHT JOINについて

SQL初心者です。
基本的な質問ですみません、教えてください。
LEFT JOINとRIGHT JOINについて、どちらのテーブルを左側、どちらのテーブルを右側にするのかが分かっていません。どういう基準で左側、どういう基準で右側と考えれてばいいのでしょうか?
宜しくお願いします。

Aベストアンサー

>どちらのテーブルを左側
FROMの次の最初のテーブルが左側です。
尚、後で解析しやすいように、なるべくLEFT JOINを使い、どうしてもRIGHT JIONが必要な場合のみRIGHT JIONを使う事を推奨します。

Qテレビでお勧めの英語ニュース

宜しくお願いします。
テレビのニュース番組で英語、日本語の切り替えができる番組を教えてください。
NHKの番組でもどれが該当するかわからず。。。

字幕放送、という情報が新聞に載っていますが、字幕全然でてこない。。。。

英語の音声を聴いている時に英語の字幕をだせるのでしょうか。。。

また、HDDに録画するときに、字幕や英語、日本語の切り替えができるように
録画することは可能でしょうか?
録画機の性能によって可能不可能があるのでしょうか。。。

教えてください。
宜しくお願いします。

Aベストアンサー

テレビは、日本人アナウンサーの声が英語に切り替えてもかすかにかぶったりして聞きづらいように思います。PCをお使いになれるのですから、PCを利用されたらどうでしょう?ケーブルテレビと契約する方法もあるのかもしれませんが・・・

☆NHK WORLD
http://www3.nhk.or.jp/nhkworld/
スクリプトもついていて利用しやすい物が多いです。ニュースですので多少スクリプトと違う場合もあります。

丁寧にNHK WORLDの英語を勉強するのであれば、以下のサイトから、「ニュースで英会話」をご利用になることをお勧めします。

☆NHK語学番組
http://www.nhk.or.jp/gogaku/

海外のニュースでしたら次のリンクサイトを利用してみて下さい。

☆英語のゆずりん
http://english.chakin.com/

「海外ニュース、英字新聞&ポッドキャスト」をクリックされるとたくさん利用できそうなサイトが紹介されます。しかし、スクリプトを利用したいのであれば「英語学習ESLサイト」等の方が利用できるものが多いかもしれません。その他にも役立つものが見つけられるサイトではないかと思います。

次のサイトは学習者向けなのでスクリプトが確実に利用できます。

☆VOA Special English
http://www.voanews.com/learningenglish/home/

最近はYouTubeを利用した次の様なサイトもあります。

☆EEvideo
http://www.eevideo.net/newsite1024/index.php

テレビは、日本人アナウンサーの声が英語に切り替えてもかすかにかぶったりして聞きづらいように思います。PCをお使いになれるのですから、PCを利用されたらどうでしょう?ケーブルテレビと契約する方法もあるのかもしれませんが・・・

☆NHK WORLD
http://www3.nhk.or.jp/nhkworld/
スクリプトもついていて利用しやすい物が多いです。ニュースですので多少スクリプトと違う場合もあります。

丁寧にNHK WORLDの英語を勉強するのであれば、以下のサイトから、「ニュースで英会話」をご利用になることをお勧めしま...続きを読む

QLEFT JOIN の結合結果について

お世話になります。

”SELECT Aテーブル.* Bテーブル.*
 FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を
行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに
なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか?

よろしくお願いします。

※ORACLE 9i、PL/SQL上での処理を考えています

Aベストアンサー

実機がないので試してませんが。

B.*ではなく、列を列挙しNVLで囲むとどうなります?

select A.列1, A.列2, nvl(B.列1, 0), nvl(B.列2, 0) from
のように。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング