一、题目
表:
Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ personId 是该表的主键(具有唯一值的列)。 该表包含一些人的 ID 和他们的姓和名的信息。表:
Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ addressId 是该表的主键(具有唯一值的列)。 该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。编写解决方案,报告
Person
表中每个人的姓、名、城市和州。如果personId
的地址不在Address
表中,则报告为null
。以 任意顺序 返回结果表。
我们可以得到信息:
1.1、两个表的主键分别为 personId、addressId,其中PersonId为外键,连接Person、Address两个表(PersonId是关键)
1.2、由题目中的“ 如果 personId
的地址不在 Address
表中,则报告为 null”,其中地址city、state位于Address表内,相当于Person的personId匹配不到Address的personID时,将地址设置为空值。意思是:地址可以为空,但是姓名一定要有,
因此可以看出结果以Person表为主
1.3、由题目中的“以 任意顺序 返回结果表”,可以得出不需要进行order by排序
二、示例
输入: 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 的地址信息。
三、答案与解析
使用left join on进行解答
select p.FirstName,p.LastName,a.City,a.State
from
person p left join address a
on
p.personid=a.personid
left join on表示以左表为准进行匹配,再筛选on后的条件。on的所有条件作为匹配条件,不符合的右表都为null。
执行结果如下:
注意:left join 中左表的全部记录都将会被查询显示,on 后面的条件对它不起作用,可通过后面加入where进行筛选