☆打卡算法☆LeetCode 175. 组合两个表 算法解析

707 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

推荐阅读

大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。

一、题目

1、算法题目

“编写一个SQL查询来报告包中每个人的信息,如果id不在表中,则报告显示为空,返回结果表。”

题目链接:

来源:力扣(LeetCode)

链接: 175. 组合两个表 - 力扣(LeetCode)

2、题目描述

表: 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 的地址信息。
示例 2:

二、解题

1、思路分析

怎么混进来一个SQL题目呢。。。

首先是两个表Person和Address,其中personId是表Person的外关键字。

可以连接两个表来获取一个人的地址信息。

使用outer join关键词。

2、代码实现

代码参考:

select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId;

image.png

3、时间复杂度

时间复杂度:

空间复杂度:

三、总结

如果没有某个人的地址信息。

使用where子句进行过滤记录会失败。

因为它不会显示姓名信息。