1

例如,我有以下两个表:

TableA { _id }
TableB { _id, TableA_id, OptionString }

TableA 中的每一行在 TableB 中都有一个或多个行引用它(使用 TableA_id 外键)。

我的查询列出了 TableA 中要显示给用户的行。

OptionString 可以是两个值之一——比如说“Option1”和“Option2”。

现在我希望查询仍然列出 TableA 中的行,但我想为用户提供一个过滤器来说明“仅显示 TableA 中 OptionString 具有“Option1”或“Option2”(即异或)的行。

我试过使用 COUNT,但问题是零计数不显示任何结果(不是我想要的“0”)。

我确定我一定错过了一些简单的东西。

任何帮助将不胜感激。

干杯,丹。

4

2 回答 2

3

试试这个,如果我正确理解你的问题

select a._id
from tableA a
join tableB b on a._id=b.tableA_id
where b.optionString in ('Option1','Option2')
group by a._id
having count(*)=1

根据新信息修改查询

select a._id
from tableA a
join (select distinct _id,tablea_id,optionString from TableB) b 
        on a._id=b.tableA_id
where b.optionString in ('Option1','Option2')
group by a._id
having count(*)=1

我在这里做的是从 tableB 中强制使用不同的值

于 2010-02-23T14:32:59.430 回答
1

一种天真的方法(也许可以改进这个......)

SELECT * 
FROM TableA
WHERE _id IN 
  (SELECT TableA_id
   FROM TableB
   WHERE OptionString IN ('Option1', 'Option2')
  )
AND _id NOT IN
  (SELECT T1.TableA_id
   FROM TableB T1
   JOIN TableB T2 ON T1.TableA_id = T2.TableA_id
   WHERE T1.optionString = 'Option1'
     AND T2.optionString = 'Option2'
  )

这个想法只是选择找到 Option1 OR the Option2 的合格记录,并排除同时找到 Option1 AND Option2 的记录。

如果我们知道对于 TableA 的给定项目只能找到给定的 Optionx 值一次,则可能适用按查询分组(请参阅 Sparky 的答案)。

于 2010-02-23T14:36:12.310 回答