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在第一个表中不是唯一的。。。所以你得到了复制品。将编辑!谢谢