Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使这个Android SQLite加入查询_Android_Sql_Sqlite - Fatal编程技术网

如何使这个Android SQLite加入查询

如何使这个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。这些表表示一个数据集的两个版本,并且有大量的数据重叠。目标是找出哪些行是不同的

SQL连接从来都不是我的强项。我想找人帮我做这个。对于SQL大师来说,这可能是一个简单的问题

我有两个具有相同列的表。假设他们的结构是:

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,因为描述可以是外语。如果您没有任何特殊要求,例如大小写独立性,它应该以这种方式工作。我如何使其大小写独立?