有人能告诉我下面两个查询是左外连接还是右外连接的例子吗??

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 左外接 TableB等于TableB 右外接 Table A.

在Oracle中,(+)表示联接中的"可选"表.所以在你的第一个查询中,它是P 左外接 S.在第二个查询中,是S 右外接 P.They're functionally equivalent.

在术语中,左边和另一边可能总是空的.所以在P 左外接 S中,P总是有一条记录,因为它在LEFT上,但是S可能是空的.

更多解释请参见this example from java2s.com.


为了澄清这一点,我想我是说术语并不重要,因为它只是为了帮助形象化.重要的是你了解它的工作原理.


右对左

在隐式连接语法中,我看到了一些关于决定右与左的问题的困惑.

左外接

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

右外接

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

我所做的只是交换WHERE子句中的术语,但它们在功能上仍然是等价的.(有关这方面的更多信息,请参见我答案的上方.)(+)的位置决定了右或左.(具体来说,如果(+)在右边,则为左连接.如果(+)在左边,则为右连接.)


连接类型

连接的两种类型是implicit JOINsexplicit JOINs.它们是不同的写作风格,但在功能上是等价的.

this SO question.

Implicit JOINs只需将所有表格列在一起即可.连接条件在WHERE子句中指定.

Implicit JOIN

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

Explicit JOINs将联接条件与特定表的包含项相关联,而不是与WHERE子句相关联.

Explicit JOIN

SELECT *
FROM A
左外接 B ON A.column = B.column

这些

Sql相关问答推荐

使用自动增量ID插入失败(无法将值空插入列ID)

在Golang中管理数据库事务的简洁方法

retrofit AWS Athena中的JSON

SQL Oracle条件分组依据

如何根据同一表中某一列中的值重新排列行(仅输出它们)(重新排序)?

你能过滤一个列表只返回多个结果吗?

在SQL查询中使用COALESS

判断序列索引处的序列是否完整

按日期时间(不包括秒)连接表

合并分层表SQL中的第一个非空、变化的空位置

按连续相等值分组排序

如何将不同层次的产品组和规格组合到最深一层?

根据时间值提取记录

两个具有 NULL 值的表达式结果之间的差异

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

在没有订单的情况下,如何生成一个值为0的顾客天数行

如何创建一个递归计数器来查找一个元素有多少父级和子级?

SQL 按 id 运行总计并受条件限制(在窗口上)

如何根据 ID 和指标从 2 个表中找到不同的值?

PostgreSQL Select 具有两列的自引用