1

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');
4

1 に答える 1

0
SELECT b.book_id, b.title, COUNT(*) FROM books b
INNER JOIN book_topics bt ON (b.book_id = bt.book_id)
GROUP BY b.book_id, b.title
HAVING COUNT(*) = 2

これは、book_topics の book-topic リレーションごとに 1 つの行しかない場合に機能します。これらのペアも一意である必要があります。データが要件を満たしていない場合は、より複雑なクエリが必要になります。
更新
book_id はこれが新しいバージョンよりも唯一の一意の識別子であるため:

SELECT b.book_id FROM books b
INNER JOIN book_topics bt ON (b.book_id = bt.book_id)
GROUP BY b.book_id
HAVING COUNT(topic_id) = 2

要件は上記と同じです。

于 2013-11-11T04:33:12.887 に答える