1

投稿しやすいように、この問題を単純化しました。他のテーブルとはまったく関係のない構成テーブルを追加することに固執しています。私の本当の問題が何であるかを確認するためにスキップしたい場合は、現在の最終出力と必要な最終出力を見てください。便宜上、最後に機能しない SQL ソリューションを用意しました。

助けてください、事前に感謝します!

背景:

基本的に、さまざまなテーブル データを接続するための 8 つの内部結合を持つステートメントがあります。私はもともと 8 つの異なるクエリを持っていましたが、私の組み込みマシンでは、クエリはそれぞれ約 2 ~ 3 秒の長さで実行され、合計時間は約 20 ~ 30 秒になりました。これは長すぎます。その時間のほとんどは、トランザクションのセットアップとティアダウンです。クエリは非常に高速でした。1 ~ 2 秒以内にデータを取得したいので、すべてのクエリを 1 つのクエリにまとめることにしました。残念ながら、テーブル自体は組み込みデバイスからクエリできない外部データベースの複製です。この時点でデータを 1 つのテーブルに結合するつもりはありません。デバイスには python2.5 と sqlite3 しかありませんが、sqlalchemy をインストールしており、通常はコードで ORM を使用しています。不運にも、

データ

表 1: ユーザー

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

表 2 (表 1 とは無関係): 構成

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
4

1 に答える 1

0

同じトランザクションでselectを2つの別々のステートメントとして発行できますか?

私は似たようなことをしています。HTTPリンクを介してSQLを送信し、JSONとしてフォーマットされたデータを送り返しています。リンクの待ち時間は1〜2秒であるため、複数のリクエストをすぐに送信できます。私の場合、セミコロンで区切ってselect呼び出しを発行するだけでよいことがわかりました。たとえば、次のようなものが機能する可能性があります。

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

注:UNIONをセミコロンに置き換えたものをコピーしました。見た目は正しくない可能性がありますが、うまくいけばわかります。

これをラップする必要があるかどうかはわかりません...-BEGIN TRANSACTIONすべてEND TRANSACTIONのクエリに対してサーバー上で自動的にこれを行います。また、SQLITE3へのCインターフェイスを使用して、応答用のJSONテーブルを生成する各行の関数へのコールバックを取得しています。私は各クエリの結果を区別していません。それらはすべて同じ関数に移動するので、これが私の場合にこれを機能させる魔法かもしれません-各クエリに同じ数の列がない場合、面白い結果が生成されます。

于 2012-10-12T04:48:25.097 に答える