如何进行此Android SQLite连接查询

时间:2012-03-01 05:34:32

标签: android sql sqlite

SQL连接从来都不是我的力量。我想要一些这方面的帮助。对于SQL大师来说,这可能很容易。

我有2个具有相同列的表。让我们说它们的结构是:

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

表名是 Shirts1 Shirts2 。这些表表示数据集的2个版本,并且具有大量数据重叠。目标是找到哪些行不同。 key 是从版本到版本保持不变的密钥。剩余的列可以从版本1更改为2.

答案应该是Android上SQLite的理想选择。多个查询都可以 - 不必是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行,因为 key 按顺序从1-1000开始。

1 个答案:

答案 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

如果你想要排除衬衫1 /衬衫2中包含的衬衫,你只需要删除最后一个工会。这意味着

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 *并忽略union。

关于设备问题:取决于设备,但如果设备已旧,那么我认为查询不是您的主要问题。您还可以尝试添加一些索引来提高性能。

编辑:更改解决方案以加入关键列