3 つの異なる SQL システムのうち、set 演算子を使用せずに正確に 2 つをカバーしている本を見つけるにはどうすればよいでしょうか。「SSRV」、「ORA」、「MySQL」の 3 つのトピック ID を使用しており、3 つのうち 2 つを出力する必要があります。たとえば、本に SSRV のトピックと ORA のトピックが含まれていても、MySQL のトピックは含まれていない可能性があります。これらのトピックの任意の 2 つの組み合わせは、フィルターを通過するのに十分です。
このテストを満たす本の book_id とタイトルを表示したいと考えています。
SELECT book_id
, title
FROM a_bkinfo.books B
WHERE book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'SSRV' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'ORA' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id = 'MySQL' )
AND book_id IN (
SELECT COUNT(*)
FROM (
SELECT book_id
, count(topic_id) AS topics
FROM a_bkinfo.book_topics BT
GROUP BY book_id
HAVING count(topic_id) = 2
) t
;
更新版:
SELECT book_id
, title
FROM a_bkinfo.books B
WHERE book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='SSRV'
OR topic_id ='ORA' )
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='SSRV'
OR topic_id ='MySQL')
AND book_id IN (
SELECT book_id
FROM a_bkinfo.book_topics BT
WHERE topic_id ='ORA'
OR topic_id ='MySQL');