我准备了一个左外连接查询,当我的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.
答案 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.incidenttag
和left 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.ROWID
是b
行数据独立。