1

たとえば、次の2つのテーブルがあるとします。

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

TableAの各行には、それを参照するTableBの1つ以上の行があります(TableA_id外部キーを使用)。

私のクエリは、ユーザーに表示するTableAの行を一覧表示します。

OptionStringは、「Option1」と「Option2」の2つの値のいずれかになります。

ここで、クエリでTableAの行を引き続き一覧表示したいのですが、「OptionStringに「Option1」または「Option2」(排他的論理和)があるTableAの行のみを表示する」というフィルターをユーザーに提供したいと思います。

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またはOption2が見つかった適格なレコードを選択し、Option1とOption2の両方が見つかったレコードを除外することです。

特定のOptionx値がTableAの特定のアイテムに対して一度しか見つからないことがわかっている場合は、group byクエリが適用できる可能性があります(Sparkyの回答を参照)。

于 2010-02-23T14:36:12.310 に答える