2017-07-29 12 views
-1

テーブルを抽出する3つのクエリがあります(以下のスクリプトを参照)。私はデータベース内の3つの元のクエリ(メモリ内のみ)からテーブルを保存することなく、新しいテーブルにこれらのテーブルを結合したいと思います。それは可能ですか?メモリ内のSQLテーブルを結合する

私は2つの理由でこれを行うにはしたいと思います:

  1. 私はCREATE TABLE my_table SELECT ..connection.commit()と、サーバー上のテーブルを保存するために仕事を得ることができないなど

  2. それは、より効率的ですこれらのテーブルはかなり大きく、リモートデータベースに格納する必要はありません(ローカルでのみ、ピクルファイルを使用して毎日バックアップを行っています)。

コード

from mysql.connector import connect as sql_connect 
import cPickle as pickle 

def extract_values_with_columns(cursor, query, multi=False, verbose=False): 
    cursor.execute(query, multi=multi) 
    results = list(cursor.fetchall()) 
    field_names = [i[0] for i in cursor.description] 
    if verbose: 
     print("Variables: {}".format(field_names), end=" ") 
    results.insert(0, field_names) 
    return results 

def save(dset_name, results): 
    with open("{}.pickle".format(dset_name), mode='w') as f: 
     f.write(pickle.dumps(results)) 

if __name__ == '__main__': 
    connection = sql_connect(user=SSH_USERNAME, password=DATABASE_PASSWORD, 
           host='127.0.0.1', port=tunnel.local_bind_port, 
           database=DATABASE_NAME)  

    print("Connection successful!") 
    cursor = connection.cursor()      # get the cursor 
    cursor.execute("USE {}".format(DATABASE_NAME)) # select the database 

    # combine ratings and tweet text 
    query = "SELECT rt.tweet_id, rt.rating_id, rt.tweet_text, \ 
      {} \ 
      FROM contribute_ratedtweet rt \ 
      INNER JOIN contribute_rating ra ON rt.rating_id=ra.id".format(emotion_factors) 
    results = extract_values_with_columns(cursor, query) 
    save('agg_tweets_with_ratings', results) 

    # combine profiles with demographics and technical data 
    # joins should be done on the original variable name, not the renamed one 
    demo_vars = "demo.gender, demo.age, demo.ethnicity, demo.education, demo.language, demo.done" 
    tech_vars = "tech.entry_point, tech.ip_addr, tech.user_agent, tech.mobile, tech.referrer, tech.time_taken, tech.usage, tech.sharing_consent, tech.time_started" 
    query = "SELECT pro.username, pro.random_seed, \ 
      demo.id AS demographic_id, {}, \ 
      tech.id AS technical_data_id, {} \ 
      FROM contribute_profile pro \ 
      INNER JOIN contribute_demographic demo ON pro.demographic_id=demo.id \ 
      INNER JOIN contribute_technicaldata tech ON pro.technical_data_id=tech.id".format(demo_vars, tech_vars) 
    results = extract_values_with_columns(cursor, query) 
    save('agg_profiles_with_info', results) 

    # add userID and tweet ID for convenience to rated tweets 
    query = "SELECT pro_rt.profile_id, pro_rt.ratedtweet_id, pro.username, rt.tweet_id \ 
      FROM contribute_profile_rated_tweets pro_rt \ 
      INNER JOIN contribute_profile pro ON pro_rt.profile_id=pro.id \ 
      INNER JOIN contribute_ratedtweet rt ON pro_rt.ratedtweet_id=rt.id" 
    results = extract_values_with_columns(cursor, query) 
    save('agg_ratings_with_info', results) 
+0

好奇心で、なぜあなたは#1を実行できませんか?エラーは何ですか?または遅すぎますか?そしてあなたの必要性について説明しますが、現在のコードに何が間違っているかは言及しません。あなたはpicklesまたは1つの大きなpickleとしてクエリを保存しますか? – Parfait

+0

エラーはありません。単に何も起こらない。テーブルは決してデータベースサーバには現れず、参照することもできません。 – pir

+0

私は上記のコードを使用して、ピクルスとしてクエリを保存しています。私がしたいのは、これらの3つのクエリから得られた結果を結合して新しいテーブルを作成することです。しかし、私は結果をサーバー上ではなくローカルで取得するため、私はそれを行うことができません。私はどうにかして、私はそれらに参加することができるようにサーバー上でクエリの結果を保持する必要があります。おそらく、私の質問は十分にはっきりしていなかったかもしれません。 – pir

答えて

1

3つのすべてのクエリがqry2 --> qry3 --> qry1関係と関連するので、誘導されたテーブル(FROM又はJOIN句でネストされたクエリ)を使用して検討。以下はそれぞれのクエリが独自のテーブル結果セットとして扱われる概略図です。ただし、データの性質によっては重複が返されることがあります。したがって、各サブクエリ内または外部クエリ内で重複排除します。

また、外側のクエリを選択した列に別名を繰り返さないために重要なことを適切T1T2、加入t3の間ON句で使用する一意の名前を提供するようにしてください。したがって、ASで必要に応じて名前を変更しても、...と入力してください。結果が完全に一致しない場合はLEFT JOININNER JOIN以上にしてください。

SELECT t1.*, t2.*, t3.* 
FROM 
    (SELECT ... 
    FROM contribute_profile pro 
    INNER JOIN contribute_demographic demo 
     ON pro.demographic_id=demo.id 
    INNER JOIN contribute_technicaldata tech 
     ON pro.technical_data_id=tech.id) t1 

INNER JOIN 
    (SELECT ... 
    FROM contribute_profile_rated_tweets pro_rt 
    INNER JOIN contribute_profile pro 
     ON pro_rt.profile_id=pro.id 
    INNER JOIN contribute_ratedtweet rt 
     ON pro_rt.ratedtweet_id=rt.id) t2 
ON t1.profile_id = t2.profile_id 

INNER JOIN 
    (SELECT ... 
     FROM contribute_ratedtweet rt 
     INNER JOIN contribute_rating ra 
     ON rt.rating_id=ra.id) t3 
ON t2.tweet_rating_id = t3.tweet_rating_id 
関連する問題