2016-07-20 7 views
0

基本的な左結合を実行しようとしている2つのまともなサイズのテーブル(200k +行)があります。それはvarchar型ですので、そこに参加したが、多くの場合、NULLするSQL JOIN ON IFの場合のベストプラクティスField1がNULL、次にField2がELSE Field1

ID1 =より良いの接合に使用することができ、各テーブル内の2つの異なるIDフィールドがあり、英数字

ID2 =は常に値、数値

を持っていますだから私は現在、このようJOININGんだけど、10分後、またはので、私はそれをキャンセルしています:

SELECT a.*, 
     b.fieldname 
FROM TABLE1 a 
    LEFT JOIN TABLE2 b 
    ON COALESCE(a.ID1,CONVERT(Varchar(10),a.ID2)) = COALESCE(b.ID1,CONVERT(Varchar(10),b.ID2)) 

私は基本的にID1 ON参加することを好むが、ID1がNULLの場合には、

ID2でJOIN

もっと効率的な方法がありますか?あなたはID1がNULLであり、それが原因で大丈夫ですほとんどの時間を見ることができるように

ID2    ID1 
300    NULL 
301    NULL 
309    NULL 
311    311-A 
311    311-B 
314    NULL 
316    316-1 
316    316-3 

:ヘルプには、データが両方のテーブルに、このように見えた場合の

**** UPDATE

考えるに感謝しましたID2はユニークですが、時にはID2の拡張があり、私はID1

に参加したい場合厥それでは、私が達成しようとするだろうことは擬似コードでこのようなものです:

SELECT a.*, 
    b.fieldname 
FROM TABLE1 a 
LEFT JOIN TABLE2 b 
    ON IF a.ID1 IS NOT NULL THEN 
      a.ID1 = b.ID1 
     ELSE 
      a.ID2 = b.ID2 
    END 
+0

以下のように記述されます確認することができますクエリを求めたあなたも、あなたのアプローチを使用することができます

  • これは、200,000行のデータに対してかなりのコンバージョンを実行しているためです。あなたはCOALESCEで何を達成しようとしていますか? 'WHERE TABLE2.ID IS NULL'を追加することで同じ結果が得られますか? 200,000行でCOALESCEを実行できなくなります。それはあなたがしなければならないコンバージョン数を減らすことさえあります。 –

  • +0

    *あなたの場合に応じて、 'WHERE TABLE2.ID IS NULL'か同等のものがあります。 –

    +3

    可能であれば、テーブル構造を再考することをお勧めします。もしそうでなければ、あなたは 'union'を使って2つのクエリを使ってより良いパフォーマンスを得るでしょう。'id1'と' id2'の両方に対してテーブルに適切なインデックスがあることを確認してください。 – sgeddes

    答えて

    1

    のON句試してみてください。
    ON (a.ID1 IS NOT NULL AND a.ID1=b.ID1) OR (a.ID1 IS NULL AND a.ID2=b.ID2)

    +0

    はい!これはずっと速くありがとう! – Jay

    0

    上記の問題に複数のソリューションがありますが...それらの カップルは以下の通りを

    • あなたがテーブル構造を再設計するために開始することができますユニークをより良く得るために id - >これはしばしば難しいと言われていますが、

    • ID2の値を、それがnullでない場合はID1の値を格納なる 、(私たちはID3を呼びましょう)、テーブル自体に計算列を作成するか、他の店 - >このアプローチは、あなたのテーブルスペースを増加します、 も書き込み速度に影響します。あなたがそう心配していない場合は、上記の書き込みパフォーマンスについて についてのみ、 パフォーマンスを読んでください。このアプローチは、より適切です。

      あなたが持つ多くの問題を持っているつもりだID1がnullであるか、そうでなければ、それは SELECT a.*,b.fieldname FROM TABLE1 a LEFT JOIN TABLE2 b ON ( (a.ID1 IS NOT NULL AND a.ID1 = b.ID1) OR (a.ID1 IS NULL AND a.ID2 = b.ID2) )
    +0

    参加していただきありがとうございました。他の地域でのご意見をお寄せいただきありがとうございます – Jay

    関連する問題