【问题标题】:Complex SQL issue in DB2DB2 中的复杂 SQL 问题
【发布时间】:2017-01-30 18:52:42
【问题描述】:

我有一个表TABLE_CLIENT_BOOK,其中包含USER_IDBOOK_CODE。此表显示了所有具有特定 USER_ID 的书籍。

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_IDBOOK_CODE,其中 BOOK_CODE 列应该具有来自TABLE_BOOK 的所有书籍的 ID,而该用户没有。例如用户 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 中实现这一点?

感谢阅读!

【问题讨论】:

  • 家庭作业?你试过什么?向我们展示您当前的查询尝试!
  • @jarlh: 我太老了,不能做作业了 :) 心理障碍
  • 我认为 left join 可以为你工作。
  • 维姬。如果没有 Group By,这对您有用吗?发送。

标签: sql db2


【解决方案1】:

执行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

【讨论】:

  • 然后可能添加 GROUP BY tcb.USER_ID, tb.BOOK_CODE ORDER BY tcb.USER_ID 以使其像 OP 所说的那样。
  • @SQLDBA,我错过了什么? IE。为什么需要 GROUP BY?
  • @SQLDBA 。 . .我不明白为什么需要GROUP BY
  • 因为我实际上在 DB2 中运行了 SQL,尽管是 v10.5,但它没有产生 OP 正在寻找的结果......直到我添加了 GROUP BY。准确地复制了答案。
  • @SQLDBA,是的,当然,user_id 在第一个表中不是唯一的......所以你会得到重复。会编辑!谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多