3

我正在学习加入我的班级,但我并没有完全掌握一些概念。有人可以解释具有多个连接的语句是如何工作的吗?

SELECT B.TITLE, O.ORDER#, C.STATE FROM BOOKS B
   LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN
   LEFT OUTER JOIN ORDERS O ON O.ORDER# = OI.ORDER#
   LEFT OUTER JOIN CUSTOMERS C ON C.CUSTOMER# = O.CUSTOMER#;

我相信我理解BOOKS表是连接BOOKS和ORDERITEMS的第一个外连接中的左表。将显示所有书籍,即使没有书籍的 ORDERITEM。第一次加入后,我不确定到底发生了什么。

ORDERS 连接时,哪个是左表,哪个是右表?对客户也是如此。这就是我迷路的地方。

4

2 回答 2

5

executor 将执行的第一件事——获取第一对有资格连接的表并执行连接。在以下步骤中,先前连接的结果被视为虚拟关系,因此您再次拥有类似于 的构造... FROM virt_tab LEFT JOIN real_tab ...。这种行为基于关系代数中使用的闭包概念,这意味着对关系的任何操作都会产生关系,即操作可以嵌套。RDBMS 代表Relational DBMS,请查看链接的 wikipedia 文章。

到目前为止,我发现 PostgreSQL 的文档在这个问题上是最权威的,看看他们。在链接的文章中,通过一些 PostrgeSQL 特定的东西给出了关于数据库如何执行连接的一般概述,这是预期的。

于 2012-06-25T13:08:41.537 回答
0

我最喜欢的在线资源之一是: http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

至于你的问题。

将显示所有书籍,并且仅显示与书籍匹配的那些订单项所有仅显示与书籍相关的订单项中具有相关记录的订单仅列出具有书籍表中项目的订单的客户。

因此,没有订单的客户不会被列出 有订单但不是书籍的客户不会被列出

好玩的东西。希望你喜欢它。

至于您的第二个问题:右/左仅因为您的 from 语句中表的 ORDER 才重要。如果您重新安排表格顺序,您可以使每个连接都成为左连接。所有右/左所做的就是指定您想要所有记录的表。

考虑一下:您可以轻松地纠正您的选择语句:

从客户中选择 B.TITLE、O.ORDER#、C.STATE C
RIGHT OUTER JOIN ORDERS O ON C.CUSTOMER# = O.CUSTOMER# RIGHT OUTER JOIN ORDERITEMS OI ON O.ORDER# = OI.ORDER# RIGHT OUTER JOIN BOOKS B ON B.ISBN = OI.ISBN

在这种情况下,权利是说我想要右边表格中的所有记录,因为书籍在列表中的最后一个,您将获得所有书籍,并且只有与书籍相关的那些订购项目,只有订购项目是的那些订单book 并且只有那些订购了书籍的订购物品的客户。因此,除了顺序之外,左/右是相同的。为了可读性,我避免右连接。我发现在考虑包含哪些内容和不包含哪些内容时,自上而下更容易。

那些被排除的记录在这些类型的连接中将具有 NULL 值。

希望这可以帮助。

于 2012-06-25T12:54:31.593 回答