sql之连接多个表之Oracle

kenshinobiy 阅读:80 2025-06-02 22:19:02 评论:0

我本周正在研究多个表连接,并返回了一些奇怪的结果。这是场景...

使用正确的表,使用传统连接操作创建查询,该查询将列出所有客户的姓名、书名和订单日期(格式为 MM/DD/YYYY,别名为“Order Date”)购买了“PRINTING IS US”出版的书籍的人。

对于我查询的数据库,此查询的正确表是 BOOK_CUSTOMER、BOOKS、BOOK_ORDER 和 PUBLISHER。我写的语句返回了我需要的信息,但它返回了将近 5900 条记录。我不明白这怎么可能是对的。出版商“Printing is Us”在数据库中只列出了 14 本书,并且只有 20 条客户记录,因此即使每个客户购买了每本“Printing is Us”的书,总共也只会返回 280 条记录。然而我无法弄清楚我有什么错。我的声明如下。

SELECT bc.firstname, bc.lastname, b.title, TO_CHAR(bo.orderdate, 'MM/DD/YYYY') "Order Date", p.publishername 
FROM book_customer bc, books b, book_order bo, publisher p 
WHERE(publishername = 'PRINTING IS US'); 

有人对我在这里想念的东西有任何想法吗?

谢谢。

请您参考如下方法:

我建议您现在就养成使用 ANSI 样式连接的习惯,这意味着您应该使用 INNER JOIN , LEFT OUTER JOIN , RIGHT OUTER JOIN , FULL OUTER JOIN , 和 CROSS JOIN SQL 语句中的元素,而不是使用“旧式”连接,其中所有表都在 FROM 中一起命名。子句和所有连接条件都放在 WHERE 中条款。与“旧式”连接相比,ANSI 样式的连接更容易理解,并且不太可能被误写和/或误解。

我将您的查询重写为:

SELECT bc.firstname, 
       bc.lastname, 
       b.title, 
       TO_CHAR(bo.orderdate, 'MM/DD/YYYY') "Order Date", 
       p.publishername 
FROM BOOK_CUSTOMER bc 
INNER JOIN books b 
  ON b.BOOK_ID = bc.BOOK_ID 
INNER JOIN  book_order bo 
  ON bo.BOOK_ID = b.BOOK_ID 
INNER JOIN publisher p 
  ON p.PUBLISHER_ID = b.PUBLISHER_ID 
WHERE p.publishername = 'PRINTING IS US'; 

分享和享受。


标签:oracle
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号