我本周正在研究多个表连接,并返回了一些奇怪的结果。这是场景...
使用正确的表,使用传统连接操作创建查询,该查询将列出所有客户的姓名、书名和订单日期(格式为 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/