谁能告诉我以下两个查询是左外连接还是右外连接的示例吗?
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/