sql - 连接多个表 - Oracle

标签 sql oracle

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

使用正确的表,使用传统连接操作创建查询,该查询将列出所有客户的姓名、书名和订单日期(格式为 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';

分享和享受。

关于sql - 连接多个表 - Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100408/

相关文章:

mysql - 通过非规范化表进行 SQL 连接 - 选择语法是什么?

sql - 让 SQL 使用正确的索引

sql - 有没有办法在 SQL 中将每个值作为一行返回

sql - 如何确定Oracle ORA_Hash函数的最佳Max_bucket和Seed_value?

oracle - 创建以字母数字开头的 Oracle 序列

java - java sqlException结果集已耗尽

sql - 从员工表中选择最早雇用的员工

sql - 如何在某一列具有相同值的行中查询具有最高列值的行

mysql - 计算来自不同sql表的同名列

mysql - 如何获取mysql中缺失的行