左外部在Oracle 11g中使用+符号join

任何人都可以告诉我是否以下2个查询是左外部连接或右外部连接的一个例子?

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 

显示所有部件,不pipe是否有供应商提供它们:

selectP.Part_Id,S.Supplier_Name
从P部分供应商S
其中P.Supplier_Id = S.Supplier_Id(+)

selectP.Part_Id,S.Supplier_Name
从P部分供应商S
其中S.Supplier_Id(+)= P.Supplier_Id

谢谢!

TableB RIGHT OUTER JOIN Table A TableA LEFT OUTER JOIN TableB等同于TableB RIGHT OUTER JOIN Table A

在Oracle中, (+)表示JOIN中的“可选”表。 所以在你的第一个查询中,它是一个P LEFT OUTER JOIN S 在你的第二个查询中,它是S RIGHT OUTER JOIN P 它们在function上是等同的。

在术语中,RIGHT或LEFT指定连接的哪一侧总是有logging,另一侧可能为空。 所以在P LEFT OUTER JOIN SP总是有一个logging,因为它在LEFT ,但S可能是空的。

请参阅java2s.com中的此示例以获取更多解释。


为了澄清,我想我说的是术语并不重要,因为它只是在那里帮助形象化。 重要的是你了解它是如何工作的概念。


右和左

我在隐式连接语法中看到了一些关于确定RIGHT和LEFT的问题。

左外连接

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

右外部join

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

我所做的只是在WHERE子句中交换条款的两边,但是它们在function上仍然是等效的。 (有关更多信息,请参阅我的答案中的更高位置。) (+)的位置决定了右或左。 (具体来说,如果(+)在右边,则是左加,如果(+)在左边,则为右加)。


JOIN的types

JOIN的两种样式是隐式的JOIN显式的JOIN 。 它们是写作JOIN的不同风格,但在function上是等同的。

看到这个问题 。

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

隐式JOIN

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

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

显式连接

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

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

这两个查询正在执行OUTER JOIN 。 见下文

Oraclebuild议您使用FROM子句OUTER JOIN语法而不是Oracle连接运算符。 使用Oracle连接运算符(+)的外部连接查询受以下规则和限制的限制,这些规则和限制不适用于FROM子句OUTER JOIN语法:

  • 您不能在也包含FROM子句连接语法的查询块中指定(+)运算符。

  • (+)运算符只能出现在WHERE子句中,或者在FROM子句中的左相关(在指定TABLE子句时)中出现,并且只能应用于表或视图的列。

  • 如果A和B由多个连接条件连接,则必须在所有这些条件中使用(+)运算符。 如果不这样做,那么Oracle数据库将只返回由简单连接产生的行,但是没有警告或错误,通知您没有外连接的结果。

  • 如果在外部查询中指定了一个表,并且在内部查询中指定了另一个表,则(+)运算符不会生成外部联接。

  • 您不能使用(+)运算符将表外连接到自身,尽pipe自连接是有效的。 例如,以下语句无效:

     -- The following statement is not valid: SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id; 

    但是,下面的自join是有效的:

     SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id ORDER BY e1.employee_id, e1.manager_id, e2.employee_id; 
  • (+)运算符只能应用于列,而不能应用于任意expression式。 但是,任意expression式可以包含一个或多个用(+)运算符标记的列。

  • 包含(+)运算符的WHERE条件不能与使用OR逻辑运算符的其他条件组合。

  • WHERE条件不能使用IN比较条件将(+)运算符标记的列与expression式进行比较。

如果WHERE子句包含将表B中的列与常量进行比较的条件,则必须将(+)运算符应用于该列,以便Oracle返回已为其生成空值的表A中的行。 否则,Oracle只返回简单连接的结果。

在执行超过两对表的外部联接的查询中,一个表可以是只有一个其他表的空生成表。 因此,在A和B的连接条件以及B和C的连接条件中,不能将(+)运算符应用于B的列。有关外部连接的语法,请参阅SELECT。

取自http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries006.htm

我在上面的答案中看到了一些矛盾,我只是在Oracle 12c上尝试了以下内容,以下是正确的:

左外连接

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

右外部join

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

在这个线程中有一些不正确的信息。 我复制并粘贴了不正确的信息:

左外连接

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

右外部join

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

以上是错误!!!!! 这是相反的。 我如何确定这是不正确的是从以下书:

Oracle OCP Oracle 9i:SQL考试指南简介 表3-1对此有一个很好的总结。 我不明白为什么我的转换SQL不能正常工作,直到我上了旧学校,看了一本印刷的书!

下面是本书的摘要,逐行复制:

Oracle外部连接语法:

 from tab_a a, tab_b b, where a.col_1 + = b.col_1 

ANSI / ISO等效:

 from tab_a a left outer join tab_b b on a.col_1 = b.col_1 

这里要注意的是,这与上面的内容相反。 我认为这本书可能会出现勘误,但是我相信这本书比本书中的内容更重要。 这是一个大声哭泣的考试指南…