[英]How to make this Android SQLite join query
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行,因為鍵從1-1000開始依次排列。
襯衫1:
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
如果要排除襯衫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 *並忽略該並集。
關於設備的問題:取決於設備,但是如果設備舊,那么我認為查詢不是您的主要問題。 您也可以嘗試添加一些索引以提高性能。
編輯:更改解決方案以加入鍵列
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.