oracle表关联问题 -- full join

本文介绍了在工作中遇到的两个不可控数据量的查询结果集关联问题,以及如何通过Full Join来解决这个问题。Full Join能够确保在数据不确定时,合并两张表的所有记录,即使没有匹配的记录也会显示。通过举例说明,如A表10条数据,B表3条数据,关联成功1条,Full Join会得到12条结果,即10+3-1。同时对比了Left Join、Right Join、Inner Join和笛卡尔积的区别。Full Join适用于需要获取所有数据,无论是否匹配的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于工作中使用sql进行表关联引发的问题

前言: 是在工作中需要将两个查询结果集关联起来并得到最后的数据。

问题: 我们需要在将两个查询结果集关联起来并得到最后的数据,但是在关联时遇见了一个问题,我们确定了关联的条件,但是却无法确定两张表的数据,因为两张表的数据数量并不是可控的。

解决方法: full join

特点: 这种连接方式将两张表进行关联,可以完美避开两张表的数据都不可控的情况。
当 A 表 中有 10 条数据,B 表中有 3 条数据,其中通过关联条件关联有 1 条关联成功。那么,我们通过full join 进行关联将出现 10 + 3 - 1 条数据。 (A,B表数据的和减去了关联成功的重复条数结果就是最后的结果集。这个结果将两张表的数据完全结合到了一起。)

同理对比:

条件一致的情况下:

A表 10条数据
B表 3条数据
关联成功的数据 1条

其中
A left join B 10条 查询结果为A表的条数
A right join B 3条 查询结果为B表的条数
A inner join B 1条 只筛选符合条件的
A full join B 12条 查询所有,去除重复的
A B 产生笛卡尔积 30条

参考链接–站内其他博客

### SQL Full Join 与 Left Join 的区别及使用场景 #### 定义与功能 Full Join 是一种返回两个中所有匹配和不匹配记录的结果集的方式。如果某个中的记录在另一个中找不到匹配项,则结果集中会显示 NULL 值[^3]。相比之下,Left Join 只保留左中的所有记录,并补充右中存在的匹配部分;对于右中不存在的匹配项,在结果集中对应的位置填充为 NULL 值。 #### 使用语法 以下是两种连接方式的标准语法: ```sql -- Full Join 示例 (适用于支持 FULL JOIN 的数据库如 PostgreSQL, Oracle 等) SELECT columns FROM table1 FULL OUTER JOIN table2 ON table1.common_column = table2.common_column; -- Left Join 示例 SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_column = table2.common_column; ``` 需要注意的是,MySQL 并未原生支持 FULL OUTER JOIN 功能[^3]。因此,在 MySQL 中实现类似的功能通常需要借助 UNION 来组合 LEFT JOIN 和 RIGHT JOIN 的结果。 #### 数据处理差异 假设存在两张 `employees` 和 `departments`,其中 `employees.department_id` 对应于 `departments.id` 字段。执行以下查询时,两者的输出会有显著不同: - **Full Join**: 返回员工 (`employees`) 和部门 (`departments`) 所有记录,无论是否存在对应的关联关系。如果没有找到关联的数据,则用 NULL 示缺失的部分。 - **Left Join**: 仅展示来自左侧(即 `employees`)的所有行以及右侧(即 `departments`)能够匹配上的列值。若某条员工记录无法映射到任何部门,则该位置填入 NULL。 #### 实际案例对比 考虑下面的例子来进一步说明它们之间的差别: | employee_id | name | department_id | |-------------|---------|---------------| | 1 | Alice | 1 | | 2 | Bob | null | | id | dept_name | |----|----------------| | 1 | HR | | 3 | Engineering | ##### 查询语句 ```sql -- Using Full Outer Join SELECT e.name AS emp_name, d.dept_name FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.id; -- Using Left Join SELECT e.name AS emp_name, d.dept_name FROM employees e LEFT JOIN departments d ON e.department_id = d.id; ``` ##### 输出结果 - **Full Join**: ``` emp_name | dept_name ---------|-------------- Alice | HR Bob | null null | Engineering ``` - **Left Join**: ``` emp_name | dept_name ---------|-------------- Alice | HR Bob | null ``` 可以看到,Full Join 还额外包含了那些只存在于右边而不在左边里的项目(例如 "Engineering" 部门),这正是其独特之处所在[^3]。 #### 应用场景分析 - 当希望获取完整的数据集合,既包括主也包括辅助的信息时,应该优先选用 Full Join- 如果更关注主体对象本身及其可能存在的附加属性描述,则可以选择效率更高的 Left Join 方式来进行操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值