【问题标题】:SQLite Left Outer Join not working as expected in AndroidSQLite Left Outer Join 在 Android 中无法按预期工作
【发布时间】:2013-10-07 23:15:30
【问题描述】:

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

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

表 A 钥匙 表 B 钥匙 斑点

我正在运行的查询应该显示来自 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 设备上。

这是一个 SQLFiddle,其中包含有问题的实际表和查询。请注意,查询在那里有效。

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

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

【问题讨论】:

  • 请注意,您在小提琴中提供的左连接与您的示例中的左连接不同。您加入的条件有两种,而不仅仅是一种。

标签: android sql sqlite join outer-join


【解决方案1】:

我认为您使用 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
  • 在执行 left join 之后,b.userida.incidenttag 中都存在 null

【讨论】:

    【解决方案2】:

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

    不过,我建议你换一个:

    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 行数据无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 2016-09-16
      • 2012-06-21
      • 1970-01-01
      • 2012-02-18
      • 2023-03-07
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多