2016-07-26 5 views
1

私は少し前から疑念があります... SQL結合のエントリをフィルタリングする最良の方法は....です。 WHERE句または結合のON?JOIN(SQL)の結果をフィルタリングする最善の方法は

たとえば、何が良いですか?このスニペットは、WHERE

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON customer.users_id = visit.CustID 
    WHERE visit.active = 1 

またはこの他の方法(ONにそのフィルタ)を使用して:

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

ありがとうございました。

+0

最初の応答が優れています。 – kingtut007

+0

私の勇気は、2人があなたに同じ答えを与えない状況があることを私に伝えています(私は頭の上から1頭も考えられませんが)。それにかかわらず、このような状況では同じ答えを与えるべきであり、第2のものはより効率的であるべきです。しかし、SQLインタプリタはかなりスマートなので、文が同じ時間で実行されると仮定します。したがって、それはスタイルになります。一般的に、where句はJOIN内の両方のテーブルに影響しないため、スタイルが優れています。 – BrandonM

答えて

1

状況の種類によって異なります。 -

最初は内側の結合として機能し、左側のテーブルからすべての行が返されず、右側のテーブルにはnullが含まれています。条件がvisit 1のすべての行を返します。それは左テーブルに

例をアクティブ他次いで1 or null行に対応している結果から、すべてのこれらの行を減らす意味: -

custome_id visit 
1   1 
2   1 

第一方が右テーブルに対応nullエントリを持つ行を返します。

例: -

custome_id visit 
1   1 
2   1 
3   null 
4   null 

注: - それは唯一の左のテーブルからO/P持っているとして、あなたの両方に文のCUSTOMER_IDはnullにすることはできません。私にとっては歴史的に

1

ステートメントを使用して、より効率的には、where句に追加するのではなく、に参加します。

SELECT 
customer.users_id AS CustID, 
FROM customer 
LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

は両方のケースは、より効率的かもしれない例がありますが、私のために私が参加文でを使用して好みます。私はそれがで使用されている場合、クエリが実行されるとき句を実行するとを参照してテーブルを検索し、visit.active = 1に基づいて結果をフィルタリングする必要があります。これは、私の経験では、とステートメントとパフォーマンスを使用するのが速く、クエリオプティマイザがデータをどのようにインデックス付けするかに関係しています。

更新:何百万というレコードを扱うときは、上記のところでより良いパフォーマンスが気づきました。レコードの数が少ない場合は、あなたのための違いはありません。

関連する問題