2016-08-29 10 views
1

を使用して参加するこれらの二つの文の間に何らかの違いがある:私は専門家ではなく文の2じゃない違いが参加し、選択

-- Statement 1: 
SELECT * 
FROM Table1 t1 
    LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id 

-- Statement 2: 
    SELECT * 
    FROM Table1 t1 
    LEFT OUTER JOIN (SELECT id, a, b, c FROM Table2) t2 on t1.id = t2.id 

だけのような貧弱に見えますSQLを書いて、それははるかに時間がかかるようです。私はコードブロックを最適化しようとしており、2番目のような多くの結合があります。彼らは技術的に同じですか、私は標準のjoin文1に置き換えることができますか?

ありがとうございます!

ps。これはOracleであり、何百万行もの行を処理しています。

PSS。私は彼らが同じであるかどうか、そして時差があるかどうかを知るために私自身の探偵仕事をしています。専門家が技術的な違いがあるかどうかを説明することを望んでいました。

+1

Table2に4つ以上の列がある場合、ステートメント2は結果セットを制限するだけです。少ないデータ量で読み込みが速くなるはずです。 – DVJex

+0

説明プランはあなたの友人です。 – sstan

+0

@DVJex:2番目の列は列の数だけを制限しますが、行の数は制限しません。 –

答えて

1

サブクエリ内のすべての列とすべての列名がサブクエリに含まれているかどうかによって、サブクエリの条件が不足しているため、これらは同じクエリではありません。サブクエリが選択リストのTABLE2の列名のすべてを含む場合、それらは同じクエリであり、サブクエリは不要です。サブクエリを使用すると、括弧内のjoinステートメントの後にselectステートメントでそのパートを参照します。

最初のものはすべての列にTABLE2を使用します。これらの列はすべて、基準が満たされた結果セットで使用可能になります。

は、しかし、第二いずれかであなたがJOINを作るテーブルはあなたのTABLE2ではなく、サブクエリのSELECTリストに指定さTABLE2、すなわちidab、およびcからわずかカラムを持つテーブル。サブクエリ内のWHERE句によって条件が適用されないため、このサブクエリの後にすべての行があります。

TABLE2から参加している選択した列のみを持つ行が同じ数になります。

2番目のものは必ずしも書きづらいものではありません。あなたはJOINTABLE2の前に会う基準を持つことができます。

+0

面白いありがとうございます。文2はid、a、b、cの各列にしかアクセスできないため、Table2のすべての列にアクセスできる点で異なります。 2番目のサブクエリがサブクエリであるという事実は、クエリに時間を追加するのでしょうか?私は他のものより速いかどうか調べるために実験しなければならないと思う。ありがとう! – russds

+0

@russdサブクエリを使用すると、クエリに余分な遅延が追加されるかどうかはわかりません。しかし、条件がないので、サブクエリの 'where'句を省略することができます。アクセス権を与えたい場合や、 'TABLE2'のいくつかのカラムだけを表示したい場合は、それらのカラムを' SELECT'リストに入れてください: 'SELECT t1。*、 t2.id、 t2.a 、 t2.b、 t3.c FROM表1 t1 LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id'。このためにサブクエリは必要ありません。 –

関連する問題