2012-04-05 8 views
1

私はこの問題を単純化して投稿するのが簡単です。私は他のテーブルとは関係のない設定テーブルを追加することに固執しています。私の本当の問題が何であるかを見るのをスキップするなら、現在の最終出力と望む最終出力を見てください。便宜上、私は最後にSQLの解決策がありません。SQLITE3:複数の無関係なテーブルと複数行の連合

ご協力いただきありがとうございます。

背景

は基本的に私は、内側8を持っている文は、さまざまなテーブルのデータを接続するために参加するんです。私はもともと8つの異なるクエリを持っていましたが、私の埋め込みマシンでは、クエリの実行時間は約2〜3秒で、合計時間は20〜30秒です。これは長すぎます。その時間の大半はトランザクションのセットアップとティアダウンです。クエリは非常に高速でした。私は1〜2秒の時間枠でデータを欲しいので、すべてのクエリを1つのクエリにまとめることにしました。残念ながら、テーブル自体は、組み込みデバイスから照会できない外部データベースと重複しています。私はこの時点でデータを1つのテーブルにまとめるつもりはない。デバイスにはpython2.5とsqlite3しかありませんが、sqlalchemyがインストールされていますが、私のコードでORMを使用しています。残念ながら、私はマシン上でバイナリをさらに生成することはできませんが、私は心の欲望と同じくらい多くのPythonを書くことができます。

データ

表1:(表1とは無関係の)ユーザー

name | number | data 
-------------------------------- 
alpha | 12345 | special 
beta  | 54321 | special-er 

表2:設定

name | data 
-------------------------------- 
lang | eng 
big  | 24 
medium | 20 
small | 13 

私は現在取得しています何のファイナルテーブル出力:

name | number | data   | config 
----------------------------------------------- 
alpha | 12345 | special  | {null} 
beta  | 54321 | special-er | {null} 
{null} | {null} | {null}   | lang:eng 
{null} | {null} | {null}   | big:24 
{null} | {null} | {null}   | medium:20 
{null} | {null} | {null}   | small:13 

私が欲しいものファイナルテーブル出力:

name | number | data   | config 
----------------------------------------------- 
alpha | 12345 | special  | lang:eng, big:24, medium:20, small:13 
beta  | 54321 | special-er | lang:eng, big:24, medium:20, small:13 

現在の(非作業)ソリューション

これは私がこれまでにしたものである:

<!-- language: sql --> 
SELECT * 
FROM (
SELECT u.name as name 
       ,u.number as number 
       ,u.data as data 
       ,NULL as config 
FROM users u 
UNION 
SELECT NULL as name 
       ,NULL as number 
       ,NULL as data 
       ,c.name||":"||c.data as config 
FROM configurations c 
) t 

答えて

0

は、あなただけの選択を発行することができます同じトランザクション内の2つの別個のステートメントとして?

私はHTTPリンクを介してSQLを送信し、JSONとしてフォーマットされたデータを送り返しています。リンクの待ち時間は1〜2秒です。したがって、複数のリクエストを送信するのは間違いありません。私の場合、セレクト・コールをセミコロンで区切って発行できることがわかりました。私はちょうどあなたがかなり右ではないかもしれない二表情に、セミコロンでUNIONを置き換えたものをコピー、うまくいけばあなたのアイデアを得る:

SELECT * 
FROM (
SELECT u.name as name 
       ,u.number as number 
       ,u.data as data 
       ,NULL as config 
FROM users u; 

SELECT NULL as name 
       ,NULL as number 
       ,NULL as data 
       ,c.name||":"||c.data as config 
FROM configurations c 
) t 

注:このような何かがうまくいくかもしれません。

BEGIN TRANSACTION ... END TRANSACTIONでこれを囲む必要があるかどうかわかりません - すべてのクエリでサーバーで自動的にこれを行います。また、SQLite3のCインターフェイスを使用して、返信用のJSONテーブルを生成する各行の関数にコールバックを取得しています。私は各クエリの結果を区別しません。彼らはすべて同じ関数になっているので、これは私の場合にはこのように働く魔法かもしれません - それぞれのクエリが同じ数のカラムを持たない場合、面白い結果が得られます。

+0

私は、数世代前のARMプロセッサを使用しているエンベデッドデバイスで作業しています。 2つの選択は、私のアプリケーションには長すぎます。 –

関連する問題