簡體   English   中英

如何使這個Android SQLite聯接查詢

[英]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

表名稱為Shirts1Shirts2 這些表代表數據集的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM