左外部在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 S
, P
总是有一个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
这里要注意的是,这与上面的内容相反。 我认为这本书可能会出现勘误,但是我相信这本书比本书中的内容更重要。 这是一个大声哭泣的考试指南…
- 如何在初始化安装Oracle数据库11g Express Edition后创build一个新的数据库?
- 在PL / SQL中使用dynamicSELECT INTO子句中的绑定variables
- Oracle 11g的默认密码?
- IO错误:networking适配器无法build立连接
- 如何在Oracle 11g中创build用户并授予权限
- 使用DISTINCT关键字导致此错误:不是一个SELECTedexpression式
- BadImageFormatException。 在安装了32位Oracle客户端组件的64位模式下运行时会发生这种情况
- ORA-01017从9i客户端连接到11g数据库时,无效的用户名/密码
- Oraclesearch所有表的所有列的string