2016-09-22 7 views
0

USER_IDBOOK_CODEを含むテーブルTABLE_CLIENT_BOOKがあります。この表は、すべての書籍が特定のUSER_IDを持つ書籍を示しています。DB2の複雑なSQL問題

USER_ID   BOOK_CODE 
------------------------------ 
1    123 
1    124 
1    567 
2    123 
2    432 
3    432 
3    567 
------------------------------- 

私は別のテーブルTABLE_BOOKを持っています。このテーブルには各書籍の詳細が含まれています。

BOOK_CODE  DETAILS 
---------------------------------- 
123    abcd 
124    pqrs 
432    xyzw 
567    lmnop 
568    efgh 
---------------------------------- 

私はUSER_IDを吐き出すとBOOK_CODE列は、ユーザーが持っていないTABLE_BOOKからのすべての書籍のIDを持っている必要がありますBOOK_CODE 2つのテーブル間のクエリを書きたいです。例えば、ユーザ1は書籍432と568を持たず、ユーザ2は124と567と568を持たず、ユーザ3は123と124と568を持たない。

したがって、クエリの結果テーブルは

USER_ID  BOOK_CODE 
---------------------------- 
1   432 
1   568 
2   124 
2   567 
2   568 
3   123 
3   124 
3   568 
----------------------------- 

このレポートは、ユーザーが持っていない本を宣伝するものです。

これをDB2 9のSQLでどうすれば実現できますか?

読んでいただきありがとうございます!

+0

宿題:

はとして実行しますか?何を試しましたか?現在のクエリの試行を表示してください! – jarlh

+1

@jarlh:私は宿題には余りにも古いです:)精神的なブロック – Nik

+0

私は左の結合があなたのために働くことができると思います。 –

答えて

3

CROSS JOINを実行して、すべてのユーザー/ブックの組み合わせを取得します。既存の組み合わせを除外するNOT EXISTSを使用します。

select distinct tcb.USER_ID, tb.BOOK_CODE 
from TABLE_CLIENT_BOOK tcb 
    cross join TABLE_BOOK tb 
where not exists (select * from TABLE_CLIENT_BOOK tcb2 
        where tcb2.USER_ID = tcb.USER_ID 
        and tcb2.BOOK_CODE = tb.BOOK_CODE) 
order by tcb.USER_ID, tb.BOOK_CODE 

また、EXCEPT

select tcb.USER_ID, tb.BOOK_CODE 
from TABLE_CLIENT_BOOK tcb 
    cross join TABLE_BOOK tb 
EXCEPT 
select USER_ID, BOOK_CODE 
from TABLE_CLIENT_BOOK 
order by tcb.USER_ID, tb.BOOK_CODE 

ここで必要ありませんDISTINCTEXCEPTは重複を削除します。

SQL>select distinct tcb.USER_ID, tb.BOOK_CODE 
SQL&from TABLE_CLIENT_BOOK tcb 
SQL& cross join TABLE_BOOK tb 
SQL&where not exists (select * from TABLE_CLIENT_BOOK tcb2 
SQL&     where tcb2.USER_ID = tcb.USER_ID 
SQL&     and tcb2.BOOK_CODE = tb.BOOK_CODE) 
SQL&order by tcb.USER_ID, tb.BOOK_CODE; 
    USER_ID BOOK_CODE 
=========== =========== 
      1   432 
      1   568 
      2   124 
      2   567 
      2   568 
      3   123 
      3   124 
      3   568 

        8 rows found 

SQL>select tcb.USER_ID, tb.BOOK_CODE 
SQL&from TABLE_CLIENT_BOOK tcb 
SQL& cross join TABLE_BOOK tb 
SQL&EXCEPT 
SQL&select USER_ID, BOOK_CODE 
SQL&from TABLE_CLIENT_BOOK 
SQL&order by tcb.USER_ID, tb.BOOK_CODE; 
    USER_ID BOOK_CODE 
=========== =========== 
      1   432 
      1   568 
      2   124 
      2   567 
      2   568 
      3   123 
      3   124 
      3   568 

        8 rows found 
+1

次に、GROUP BY tcb.USER_ID、tb.BOOK_CODE ORDER BY tcb.USER_IDを追加して、OPのようにすることができます。 – smoore4

+0

@SQLDBA、私は何を欠場しましたか?私。なぜGROUP BYは必要ですか? – jarlh

+0

@SQLDBA。 。 。なぜ私はGROUP BYが必要なのか分かりません。 –