【问题标题】:SQL statement to get the titles of the books that were not orderedSQL语句获取未排序的书名
【发布时间】:2021-05-21 23:03:40
【问题描述】:

我正在尝试列出所有书名以及订购每个书名的客户的名字和姓氏。

SELECT DISTINCT c.customer#, lastname || ', ' || firstname "Customer", title
  FROM customers c, orders o, orderitems i, books b
  WHERE c.customer# = o.customer#
  AND o.order# = i.order# AND i.isbn = b.isbn;

我仍然不知道如何获得未订购的书籍的标题。 谢谢。

结构:

  • 客户:客户编号、姓氏、名字
  • 订单:客户编号、订单日期
  • Orderitems:Order#、item#、isbn
  • 书籍:书名,isbn

【问题讨论】:

  • 您需要left joinnot exists,具体取决于您想要什么(不清楚)。请使用正确的连接语法,而不是不推荐使用的, cross-join
  • 你能分享更多关于你正在使用的数据库的信息吗? Microsoft Sql Server、Orcale 等,你们使用的 sql 类型如 T-SQL、PL-SQL、Hive 查询语言 (HQL)
  • 我已将更多信息添加到我的数据库中。谢谢。

标签: sql


【解决方案1】:

如果您的数据库支持反连接,则使用 isbn 作为连接键在订单和书籍表之间进行反连接,这将为您提供尚未订购的书籍记录。

select b.title as title
from books b
leftanti join orderitems oi
on b.isbn = oi.isbn

否则,您可以使用左外连接将书籍作为左表,将订单作为右表,然后过滤输出中与订单表中不匹配的记录。这将为您提供所需的输出。

select title from
(select b.title as title , b.isbn as isbn , oi.orderno as orderno
from books b
left outer join orderitems oi
on b.isbn = oi.isbn) temp
where orderno IS NULL

按照@Charlieface的建议,你也可以试试

select b.title from books b
where b.isbn not exists in 
(select distinct(isbn) from orderitems) temp;

PS:我主要使用 Give Query 语言 (HQL),所以我的语法是基于相同的。根据您的数据库和 SQL 类型,您必须相应地调整查询。

【讨论】:

  • 我已经添加了我的数据库的结构。谢谢。
  • 我已经根据你的更新修改了我的答案:)
  • 那么,还有一个问题:我怎样才能得到姓氏和名字包括所有的标题、isbn 和 ordernumber?
  • @congdanh1594 我有点困惑,你想包括名字姓氏和已订购书籍/标题的其他详细信息吗?因为您最初的问题是关于获取从未订购过的书籍的标题。也许如果您可以更好地改写您的问题并发布一些您期望的输出示例,那就太好了!
【解决方案2】:

你可以试试这样的:

  SELECT o.order,c.customer,c.lastname,c.firstname,b.title
  FROM orders o
  JOIN orderitems oi 
  ON oi.order = o.order
  JOIN books b
  ON b.isbn = oi.isbn;

在我看来,将Order ID 包含在您的结果中会很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多