SQL - 基于引用表的XOR

时间:2010-02-23 14:27:39

标签: sql xor

比如说,我有以下两个表:

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

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

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

OptionString可以是两个值中的一个 - 让我们说“Option1”和“Option2”。

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

我尝试过使用COUNT,但问题是零数不显示结果(不是我想要的'0'。

我确信我必须错过一些简单的东西。

非常感谢任何帮助。

干杯, 丹。

2 个答案:

答案 0 :(得分: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

中的不同值

答案 1 :(得分: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或Option2的合格记录,并排除找到Option1和Option2的记录。

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