2012-03-01 22 views
0

SQL結合は私の強みです。私はこのことについていくつかの助けをしたいと思います。これはおそらくSQLマエストロのための簡単なものです。このAndroid SQLiteの登録クエリを作成するには

私は同じ列を持つ2つのテーブルを持っています。のは、その構造があるとしましょう:

id INTEGER PRIMARY KEY AUTOINCREMENT, 
key INTEGER, 
description TEXT NOT NULL, 
size INTEGER, 
timestamp LONG, 
is_on INTEGER 

テーブル名がShirts1Shirts2です。テーブルは2つのバージョンのデータセットを表し、データの重複量が大きい。目標は、どの行が異なるかを見つけることです。 キーは、バージョンごとに変わらないキーです。残りの列はバージョン1から2に変更できます。

AndroidのSQLiteには、理想的には回答が必要です。複数のクエリはOKです.1つのクエリである必要はありません。

私の推測

SELECT * FROM Shirts1, Shirts2 WHERE Shirts1.key=Shirts2.key AND 
     (Shirts1.description != Shirts2.description OR 
     (Shirts1.size != Shirts2.size OR 
     (Shirts1.timestamp != Shirts2.timestamp OR 
     (Shirts1.is_on != Shirts2.is_on) 

もう一つの懸念はあるだろう限られたデバイスメモリとAndroid携帯電話上でこの原因の問題のようなクエリ?両方の表には1000行あります。クエリを複数のクエリに分解して、たとえば、比較を100行に制限する場合は、というキーが1-1000の順になります。

+0

実際のデータで実際のデータを試してみて、実際のデバイスの性能を確認してください。 –

答えて

0

Shirt1:

1;1;"green_shirt";1;1;1 
4;4;"yellow_shirt";1;1;1 

Shirt2:

1;1;"green_shirt";1;1;1 
2;2;"red_shirt";1;1;1 
3;3;"orange_shirt";1;1;1 



SELECT shirt2.* 
    FROM shirt1 
    RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key 
WHERE shirt1.description != shirt2.description OR 
     IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR 
     IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR 
     IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)  
UNION ALL 
SELECT shirt1.* 
    FROM shirt2 
RIGHT JOIN shirt1 ON shirt1.key = shirt2.key 
WHERE shirt1.description != shirt2.description OR 
     IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR 
     IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR 
     IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1) 
UNION ALL 
SELECT shirt1.* 
    FROM shirt1 
INNER JOIN shirt2 ON shirt1.key = shirt2.key 
WHERE shirt1.description = shirt2.description OR 
     IFNULL(shirt1.size, -1) = IFNULL(shirt2.size, -1) OR 
     IFNULL(shirt1.timestamp, -1) = IFNULL(shirt2.timestamp, -1) OR 
     IFNULL(shirt1.is_on, -1) = IFNULL(shirt2.is_on, -1) 

出力:

2;2;"red_shirt";1;1;1 
3;3;"orange_shirt";1;1;1 
4;4;"yellow_shirt";1;1;1 
1;1;"green_shirt";1;1;1 

あなたはshirt1/shirt2に含まれているTシャツを除外したい場合は、単に削除する必要が最後の組合それは

SELECT shirt2.* 
    FROM shirt1 
    RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key 
WHERE shirt1.description != shirt2.description OR 
     IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR 
     IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR 
     IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)  
UNION ALL 
SELECT shirt1.* 
    FROM shirt2 
RIGHT JOIN shirt1 ON shirt1.key = shirt2.key 
WHERE shirt1.description != shirt2.description OR 
     IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR 
     IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR 
     IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1) 

出力を意味します

2;2;"red_shirt";1;1;1 
3;3;"orange_shirt";1;1;1 
4;4;"yellow_shirt";1;1;1 

をので、私は、これはよりよい解決策であるべきだと思いますが、同じ列内のすべてのものをしたいと思います。もしあなたがshirt1/shirt2のために異なった列を持っていることが大丈夫なら、あなたはselect *を使用して、共用体を無視することもできます。

デバイスに関する質問:デバイスに依存しますが、デバイスが古い場合は、クエリが主な問題になるとは思われません。パフォーマンスを向上させるために、いくつかのインデックスを追加することもできます。

編集:ソリューションをキー列に追加するように変更しました

+0

私は整数がヌルかもしれないと思うなぜifnullチェックが必要です.. btw、私は_key_は我々が参加する必要があると思う。また、「同じ列のすべて」という意味を説明できますか? – amit

+0

あなたがselect *をすると、shirt1.key、shirt2.keyなどのようなものが得られることになります(つまり、すべてのシャツの列ごとに列が表示されます)。私はあなたが1つの列を持つソリューションを好むと思う(キーのために、あなたはshirt1と2の結合された値を持つkeyという名前の単一の列を取得します)、その単一の列に両方の値を持ちます。参照してください – Eggi

+0

。 btw、**との文字列比較はできますか?= **または機能がありますか?説明は外国語でもよいので、比較はutf8にする必要があります。 – amit

関連する問題