これを試して
SELECT
whatever
FROM
A
INNER JOIN B
ON A.A_ID = B.A_ID
WHERE
B.C_ID IN (4, 5)
また
SELECT
whatever
FROM
A
INNER JOIN B
ON A.A_ID = B.A_ID
WHERE
B.C_ID = 4 OR B.C_ID = 5
アップデート
一致するペアのみが必要な場合
SELECT
whatever
FROM
A
INNER JOIN B
ON A.A_ID = B.A_ID
WHERE
A.A_ID IN (SELECT A_ID
FROM B
WHERE C_ID IN (4, 5)
GROUP BY A_ID
HAVING COUNT(*) = 2) AND
B.C_ID IN (4, 5)
副選択A_ID
は、レコードごとにグループ化してカウントします。HAVING句はWHERE句と同様に機能しますが、グループ化後に実行されます。したがって、内側のselectは、A_ID
の(4、5)ペアに対応するsのみを返しますC_ID
。クエリ全体は常に次のような偶数のレコードを返します
A_ID | B_ID | C_ID
1 | 1 | 4
1 | 2 | 5
2 | 3 | 4
2 | 4 | 5
編集
C_ID 4と5だけでなく、それ以上C_IDが存在しないA_IDのみが必要な場合は、クエリを次のように変更します。
SELECT B.*
FROM A INNER JOIN B ON A.A_ID = B.A_ID
WHERE B.C_ID IN (4, 5) AND
A.A_ID IN (SELECT A_ID
FROM B
GROUP BY A_ID
HAVING MIN(C_ID)=4 AND MAX(C_ID)=5 AND COUNT(*)=2)
2つの数字(この例では4と5)が常に連続している場合は、COUNT(*)=2
パーツを削除できます。
(注:コメントの1つによると、結合はA_ID
列にあります。すべての例で変更しました。)
ロビンによる更新
ありがとう、あなたの助けを借りて私はこれを思いついた:
SELECT
*
FROM
A a
INNER JOIN B
ON a.A_ID = B.A_ID
WHERE
(SELECT COUNT(*) FROM B b WHERE b.A_ID = a.A_ID and C_ID IN (4, 5)) =
(SELECT COUNT(*) FROM A aa INNER JOIN B b ON aa.A_ID = b.A_ID WHERE b.A_ID = a.A_ID)