sql - Oracle 11g 中使用 + 符号的左外连接

标签 sql oracle11g

谁能告诉我以下两个查询是左外连接还是右外连接的示例吗?

Table Part:
Name         Null?       Type
PART_ID      NOT NULL    VARCHAR2(4)
SUPPLIER_ID              VARCHAR2(4)

PART_ID SUPPLIER_ID
P1      S1
P2      S2
P3  
P4  

Table Supplier:
Name            Null?     Type
SUPPLIER_ID NOT NULL      VARCHAR2(4)
SUPPLIER_NAME   NOT NULL  VARCHAR2(20)

SUPPLIER_ID  SUPPLIER_NAME
S1           Supplier#1
S2           Supplier#2
S3           Supplier#3

显示所有零件,无论供应商是否提供:

SELECT P.Part_Id, S.Supplier_Name
FROM Part P, Supplier S
WHERE P.Supplier_Id = S.Supplier_Id (+)

SELECT P.Part_Id, S.Supplier_Name
FROM Part P, Supplier S
WHERE S.Supplier_Id (+) = P.Supplier_Id

最佳答案

TableA LEFT OUTER JOIN TableB 相当于 TableB RIGHT OUTER JOIN Table A

在 Oracle 中,(+) 表示 JOIN 中的“可选”表。因此,在您的第一个查询中,它是一个 P LEFT OUTER JOIN S。在第二个查询中,它是S RIGHT OUTER JOIN P它们在功能上是等效的。

在术语中,RIGHT 或 LEFT 指定连接的哪一侧始终有记录,另一侧可能为空。因此,在 P LEFT OUTER JOIN S 中,P 将始终有一条记录,因为它位于 LEFT,但 S > 可能为空。

参见this example from java2s.com以获得更多解释。

<小时/>

为了澄清,我想我是说术语并不重要,因为它只是为了帮助可视化。重要的是您了解其工作原理的概念。

<小时/>

右与左

对于在隐式连接语法中确定 RIGHT 与 LEFT 的重要性,我发现了一些困惑。

左外连接

SELECT *
FROM A, B
WHERE A.column = B.column(+)

右外连接

SELECT *
FROM A, B
WHERE B.column(+) = A.column

我所做的只是交换了 WHERE 子句中术语的两边,但它们在功能上仍然是等效的。 (有关更多信息,请参阅我的答案中的较高部分。)(+) 的位置决定右或左。 (具体来说,如果 (+) 在右侧,则为 LEFT JOIN。如果 (+) 在左侧,则为 RIGHT JOIN。)

<小时/>

JOIN 类型

JOIN 的两种样式是隐式 JOIN显式 JOIN。它们是不同的 JOIN 编写风格,但它们在功能上是等效的。

参见this SO question .

隐式联接只是将所有表列出在一起。连接条件在 WHERE 子句中指定。

隐式 JOIN

SELECT *
FROM A, B
WHERE A.column = B.column(+)

显式联接将联接条件与特定表的包含项相关联,而不是在 WHERE 子句中。

显式 JOIN

SELECT *
FROM A
LEFT OUTER JOIN B ON A.column = B.column

这些 隐式联接可能更难以阅读和理解,并且它们也有一些限制,因为联接条件混合在其他 WHERE 条件中。因此,通常不建议使用隐式 JOIN,而建议使用显式语法。

关于sql - Oracle 11g 中使用 + 符号的左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559261/

相关文章:

xml - 使用 FLWOR 从选定节点删除 xml 子元素

sql - 避免在 View 中使用子查询或分析功能进行全表扫描

php - 这些功能在哪里? "variables"?来自?

mysql - 如何识别性能问题查询-MYSQL

sql - 将 SQL Server 中的字符串更改为缩写

java - 如何查看Oracle中的JDK版本?

sql - JOIN psql 中的三个表(SQL 查询)

MySQL:在不使用子查询的情况下选择数据集的最小值

sql - ORA-00942 : table or view does not exist ( on another schema on same DB )

linux - 在 Arch Linux 中安装 Oracle Database Express Edition 11g 第 2 版