2017-10-26 4 views
-1

Big_Tableには何百万ものレコードがあります。 Little_Tableは、再フォーマットされ、インポートされるスプレッドシートで、〜25,000レコードです。mysqlの異なるテーブルから複数のカラムを使用して結合する

Big_Table 
  • 共通の列:INSTR日付TS
  • これらのテーブルは、一致させる必要があるいくつかの共通の類似が、発現さ-列を別々に、共有しますサンプルデータ:SPY20170602PUT241, 2017-06-01 09:21:20.107, 09:21:00.935

Little_Table

  • 共通の列:音源時間
  • サンプルデータ:SPY20170602PUT241, 6/1/2017, 9:21:00

目的は、* Little_Tableと一致Big_Tableからレコードを取得することです。これを行うには、必要に応じてLittle_Tableの列を構築/再フォーマットしてから、ジョブを取得するためのクエリを作成するというガイダンスが必要です。にご相談ください。 これら三つの基準は、各テーブルの行のために真であるところ*マッチがある:

- instr and instrument are the same exact string 

- date and Date indicate the same mm/dd/yyyy 

- ts and time indicate the same hh/mm/ss 
+0

常に、そのデータの正しいデータ型を使用してデータを格納します。 – Strawberry

答えて

0

ここです何が私のために働いた。カスタムメイドのカラムBig_Tableの新しい修正バージョンを作成しました。trade_name。私はカスタム列trade_nameでLittle_Tableを作成しました。特に一致するようにしました。私はそれが最善の解決策だとは思っていませんが、うまくいきました。ここで詳細は次のとおり

* trade_name、操作列は、+( フォーマット正規化、連結された文字列に、日付を元々各テーブルの不一致フォーマットと別の列であった3つのマッチング基準を組み合わせ時間+計器)。すなわち、各テーブルについて、日付、時刻および計器を表す列を、類似のフォーマットで、列の列に連結した。

  1. Big_Table_Newの作成:私は、Big_TableからCREATE TABLE文を使用し、「Big_Table_New」と呼んで、キーを削除し、コラム「商品名」を追加、これを使用してデータを埋め、それテーブルのインデックス行われ、声明:

    INSERT INTO Big_Table_New 
    SELECT *, CONCAT_WS(' | ',instr,DATE(date),TIME_FORMAT(ts,'%T')) 
    FROM Big_Table 
    WHERE date>='2017-06-01 00:00:00' AND date<'2017-06-02 00:00:00' 
    AND instr IN (SELECT instrument FROM instruments); 
    

    私は2017年6月の月のレコードを必要とし、回避策として、私は、クエリするので、代わりに一度に月全体選択するので、月の日ごとに問合せを2回繰り返し、 6月のある特定の日に時間切れになっていた。上に移動...

  2. Little_Tableの作成:まず、テーブルスキーマを作成するためにCREATE TABLE Little_Table文を使用しました。私はtrade_nameの列を含め、インデックスを作成しました。次に、SETを使用して、同じステップでtrade_nameのフォーマット変更と連結を適用して、csvファイルをロードしました。

    LOAD DATA LOCAL INFILE 'C:\\myfilepath\\Little_File.csv' 
    INTO TABLE Little_Table 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\r\n' 
    IGNORE 1 LINES 
    (l_instr, @l_date, @l_ts, l_prc, l_side, l_qty, trade_name) 
    SET 
        l_date = DATE_FORMAT(STR_TO_DATE(@l_date, '%m/%d/%Y'), '%Y-%m-%d'), 
        l_ts = TIME_FORMAT(DATE_SUB(STR_TO_DATE(@l_ts, '%H:%i:%s'), INTERVAL 1 HOUR),'%T'), 
        trade_name = CONCAT_WS(' | ',l_instr,l_date,l_ts); 
    
  3. 最終クエリは、このステートメントを使用:

    SELECT * 
    FROM Big_Table_New, Little_Table_New 
    WHERE Big_Table_New.`trade_name` = Little_Table_New.`trade_name`; 
    

    クエリが十分に良かった〜150秒を取りました。

0

これは単純なこの例を試してみてください、複数のconditiosに参加している私の理解あたりとして:

SELECT * FROM Big_Table JOIN Little_Table ON (instr=instrument AND date=Date AND ts=time) WHERE .... 
関連する問題