由于是自己用作总结和温记就只把涉及知识点或思路写上,为了日后重做题目就不把源代码贴上来了
题目:
表: Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
personId 是该表的主键列。
该表包含一些人的 ID 和他们的姓和名的信息。
表: Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
addressId 是该表的主键列。
该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。
以 任意顺序 返回结果表。
查询结果格式如下所示。
示例 1:
输入:
Person表:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
输出:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+
解释:
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/combine-two-tables
涉及知识:
首先,题目主要要求是对表的查询,而查询内容横跨两个不同的表,所以我们需要将两表连接。
关键的点就在于题目要有解释道“地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。”一般来说,我们做两个表的连接常用到inner join,但是inner join连接它只适用于当连接的两个表值都存在,不会有不对应情况。
这时候要用到外连(outer join):其适用于我们两个表中当一个表中没有没有另一个表对应值的情况。
其中:
A letf join B: 以A中值为基准,如果B表有不对应情况时,返回null
A right join B: 以B中值为基准,A表有不对应,返回null