DB2中的复杂SQL问题

DB2中的复杂SQL问题,sql,db2,Sql,Db2,我有一个表table\u CLIENT\u BOOK,其中包含USER\u ID和BOOK\u code。此表显示了具有特定用户ID的所有书籍 USER_ID BOOK_CODE ------------------------------ 1 123 1 124 1 567 2 123 2 432 3 432 3

我有一个表
table\u CLIENT\u BOOK
,其中包含
USER\u ID
BOOK\u code
。此表显示了具有特定用户ID的所有书籍

USER_ID         BOOK_CODE
------------------------------
1               123
1               124
1               567
2               123
2               432
3               432
3               567
-------------------------------
我有另一个表
table\u BOOK
,其中包含每本书的详细信息

BOOK_CODE        DETAILS
----------------------------------
123              abcd
124              pqrs 
432              xyzw
567              lmnop
568              efgh
----------------------------------
我想在这两个表之间编写一个查询,它将输出
USER\u ID
BOOK\u code
其中BOOK\u code列应该具有该用户没有的
TABLE\u BOOK
中的所有书籍的ID。例如,用户1没有书籍432和568,用户2没有书籍124567和568,用户3没有书籍123124568

因此,查询的结果表将是:

USER_ID     BOOK_CODE
----------------------------
1           432
1           568
2           124
2           567
2           568
3           123
3           124
3           568
-----------------------------
此报告是为用户没有的书籍做广告

如何在DB29中的SQL中实现这一点


谢谢你的阅读

执行
交叉连接
以获取所有用户/书籍组合。使用
不存在
排除已存在的组合:

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
或者,
除了

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
此处不需要
DISTINCT
<代码>除此之外删除重复项

执行为:

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

执行
交叉连接
以获取所有用户/书籍组合。使用
不存在
排除已存在的组合:

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
或者,
除了

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
此处不需要
DISTINCT
<代码>除此之外删除重复项

执行为:

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


作业你试过什么?显示您当前的查询尝试@杰尔:我太老了,不能做家庭作业:)精神障碍我想左撇子可以帮你。在没有团队成员的情况下,这对你有用吗?家庭作业?你试过什么?显示您当前的查询尝试@杰尔:我太老了,不能做家庭作业:)精神障碍我想左撇子可以帮你。在没有团队成员的情况下,这对你有用吗?然后可能会按tcb.USER\u ID添加GROUP,按tcb.USER\u ID添加tb.BOOK\u代码顺序,使之像OP所说的那样。@SQLDBA,我错过了什么?也就是说,为什么需要一个组?@SQLDBA。我不明白为什么需要一个
groupby
,因为我实际上在DB2中运行了SQL,虽然是v10.5,但它并没有产生OP想要的结果……直到我添加了groupby。完全复制了答案。@SQLDBA,是的,当然,用户id在第一个表中不是唯一的。。。所以你得到了复制品。将编辑!谢谢然后可能按tcb.USER\u ID添加GROUP,按tcb.USER\u ID添加tb.BOOK\u代码顺序,使之像OP所说的那样。@SQLDBA,我错过了什么?也就是说,为什么需要一个组?@SQLDBA。我不明白为什么需要一个
groupby
,因为我实际上在DB2中运行了SQL,虽然是v10.5,但它并没有产生OP想要的结果……直到我添加了groupby。完全复制了答案。@SQLDBA,是的,当然,用户id在第一个表中不是唯一的。。。所以你得到了复制品。将编辑!谢谢