2

一連のエントリを選択し、それらのエントリを使用して一連の行を単一の行に選択するクエリが必要です。典型的なエントリと、典型的な結果がどのように見える必要があるかを以下に示します。

table1
id
-------
3     

table2
id      value       table1
--------------------------
5       value1      3
6       value2      3

table3
id      value       table1
-------------------------
9       value3      3
10      value4      3

table4
id      table1
---------------
14      3
15      3

table5
id      value       table4
-------------------------------
19      value5      14
20      value6      14
21      value7      15


result
result1 result2     result3     result4
------------------------------------------------------
3       value1      value3      value5, value6; value7

表 1 と表 2 の最初の結果のみが必要です。多くの場合、テーブル 2 は null になる可能性があり、value3 は result2 に入る必要があります。現時点では、result1のみを返す以下のようなステートメントで各エントリを選択し、各エントリに対して結果ごとに個別のクエリを実行します

SELECT DISTINCT id FROM (
    -complicated select in here
) AS temp;

そして、IDごとに個別に実行します:

SELECT value FROM table2 WHERE table1 = id LIMIT 1;

SELECT value FROM table3 WHERE table1 = id LIMIT 1;

SELECT value, table4.id FROM table4, table5 WHERE table4.id = table5.table4 AND table1 = id;

コードを使用して、結果テーブルのような形式にフォーマットします。

問題は、最初のクエリのみがバックグラウンド スレッドで実行され、残りのクエリは UI スレッドで実行されることです。すべてを 1 つのクエリで実行したいのですが、table4 を 1 行にまとめられず、table2 と table3 の最初の結果のみを選択するのに問題があります。

4

1 に答える 1

3

このような条件付き関係の場合、複数の選択を実行したり、一時テーブルを作成して段階的にキーを入力したり、一時テーブルに対して最終的な選択を行ったりするのがはるかに簡単になります。

結果4を見ると、事実上、条件付きロジックを使用して外部結合を使用してテーブル内のデータを非正規化してから再正規化しようとしています。おそらく実行できますが、「賢明な」データベース開発の粒度に反して実行される可能性があります問題が発生した場合、デバッグがほぼ不可能なクエリになってしまいます。

sqlite は、軽量環境で使用するための SQL 標準の単純な実装を意図していることを知っているので、問題が発生する前に SQL がどれほど複雑になるかはわかりません。

あなたが達成しようとしていることは完全には明らかではありませんが、回避策は次のようないくつかの UNION ステートメントを使用することです。

SELECT DISTINCT source, id FROM (
    SELECT table2.table1 AS table1, 'table2' AS source, value AS id FROM table2 
    UNION
    SELECT table3.table1, 'table3', value FROM table3 
    UNION
    SELECT table4.table1, 'table5', value FROM table5, table4 
    WHERE table4.id = table5.table4)
WHERE table1 = 3;

次に、次のような結果が得られます。

source    | id
-----------------------
table2    | value1
table3    | value3
table4    | value5
table4    | value6
table4    | value7

もう 1 つのオプションは、すべてのユニオン (および上記で選択した 2 つだけでなく、3 つの列すべて) を含むビューを作成することです。次に、table1 の値を選択するだけで同じ結果が得られます。

于 2013-03-16T09:27:34.943 に答える