SQLite Left Outer Join在Android中无法正常工作

时间:2013-10-01 17:19:40

标签: android sql sqlite join outer-join

我准备了一个左外连接查询,当我的BLOB表中存在一个匹配带有INCIDENT表中记录的键的记录时,该查询应该返回非空数据。

基本上,数据和查询如下所示:

Table A
   Key

Table B
   Key
   Blob

和我正在运行的查询应该显示来自A的所有记录,如果B中的记录具有匹配的键列,则'hasb'列应该为1,否则应为0。所以查询应该如下所示:

SELECT A.*, ifnull(A.Key = B.Key, 0) as hasb FROM A
LEFT OUTER JOIN B ON A.Key = B.Key

好的,我的问题是,这个查询似乎无处不在我尝试在Android设备上使用EXCEPT。

这是一个带有实际表和查询的SQLFiddle。请注意,查询在那里工作。

http://sqlfiddle.com/#!7/89e7d/4

任何人都知道为什么这在Android上不起作用?我正在测试的设备是运行Android 4.1.1的三星Galaxy S 3.

2 个答案:

答案 0 :(得分:2)

我认为你使用ifnull过度复杂化了。

这是你小提琴中的查询:

SELECT ifnull( a.userid = b.userid, 0 ) FROM incidentdata AS a
LEFT OUTER JOIN incidentblob AS b
ON ( a.userid = b.userid ) AND ( a.incidenttag = b.incidenttag );

这是我要写的查询:

SELECT a.userid, a.incidenttag, b._id, b._id is not null hasb
FROM incidentdata AS a
LEFT JOIN incidentblob AS b
ON a.userid = b.userid AND a.incidenttag = b.incidenttag

有用吗?如果不满意,请提供您正在使用的SQLite版本。无论如何,我很确定这个问题存在于以下几个方面:

  • 了解null = null不会返回TRUE而是null
  • 执行null 后,{li> b.userid值出现在a.incidenttagleft join

答案 1 :(得分:0)

我知道您的查询"似乎无处不在"。

但是,我建议你另外一个:

SELECT a.*, b.ROWID IS NOT NULL AS hasb FROM a LEFT JOIN b ON a.key IS b.key;

的差异:

  • 避免IFNULL函数调用;
  • a.key IS b.key将处理空键值;
  • 检查b.ROWIDb行数据独立。