如何使这个Android SQLite加入查询
SQL连接从来都不是我的强项。我想找人帮我做这个。对于SQL大师来说,这可能是一个简单的问题 我有两个具有相同列的表。假设他们的结构是:如何使这个Android SQLite加入查询,android,sql,sqlite,Android,Sql,Sqlite,SQL连接从来都不是我的强项。我想找人帮我做这个。对于SQL大师来说,这可能是一个简单的问题 我有两个具有相同列的表。假设他们的结构是: id INTEGER PRIMARY KEY AUTOINCREMENT, key INTEGER, description TEXT NOT NULL, size INTEGER, timestamp LONG, is_on INTEGER 表名为Shirts1和Shirts2。这些表表示一个数据集的两个版本,并且有大量的数据重叠。目标是找出哪些行是不同的
id INTEGER PRIMARY KEY AUTOINCREMENT,
key INTEGER,
description TEXT NOT NULL,
size INTEGER,
timestamp LONG,
is_on INTEGER
表名为Shirts1和Shirts2。这些表表示一个数据集的两个版本,并且有大量的数据重叠。目标是找出哪些行是不同的。密钥是在不同版本之间保持不变的密钥。其余列可以从版本1更改为版本2
答案应该是Android上SQLite的理想选择。多个查询可以-不必是一个查询
我猜
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 Shirt1:
1;1;"green_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
衬衫2:
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
2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
如果您想排除shirt1/shirt2中包含的衬衫,您只需删除最后一个联合。这意味着
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
1;1;"green_shirt";1;1;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
关于设备问题:取决于设备,但是如果设备是旧的,那么我不认为查询将是您的主要问题。您还可以尝试添加一些索引来提高性能
编辑:将解决方案更改为在键列上联接它应该可以正常工作,但可以在实际数据上尝试,并在实际设备上检查性能。我猜整数可以为null,这就是为什么需要ifnull检查的原因。。顺便说一句,我相信关键是我们需要加入。另外,你能解释一下“同一列中的所有内容”是什么意思吗?我的意思是,如果你做一个select*你会得到类似shirt1.key、shirt2.key等的内容(因此你会得到每件衬衫中每一列的一个列)。我认为您更喜欢只包含一列的解决方案(因此对于键,您将获得一个名为key的列,该列的连接值为shirt1和two),并且在该列中包含两个值。我明白了。顺便说一句,你能用!=做字符串比较吗?还是有一个功能?比较需要是utf8,因为描述可以是外语。如果您没有任何特殊要求,例如大小写独立性,它应该以这种方式工作。我如何使其大小写独立?