Leecode 组合两个表

原题

表1: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+

PersonId 是上表主键

表2: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+

AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combine-two-tables
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

方法:使用 outer join

因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。

考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join

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

作者:LeetCode
链接:https://leetcode-cn.com/problems/combine-two-tables/solution/zu-he-liang-ge-biao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

反思

这道题不会的原因是长时间没有写SQL,语法忘得差不多了,尤其是OuterJoin 和Inner Join。
换成面试可能就直接问OuterJoin 和Inner Join的区别了。
这里回顾一下知识点:
https://blog.csdn.net/chanmufeng/article/details/78234654
外连接一定能在另一个表中找到匹配的行,没有就是null。
这里要求无论是否有地址信息,都得提供city,state信息,即地址信息,所以地址信息可以为空。
因为说的主语是person,所以左表是Person,右表是Address,使用left join可以查询坐标所有行,与左表匹配的右表行正常显示,匹配不上,即没有对应的,会显示为null。这样就完成了题目要求。

不会做的原因是把left join 和 right join忘了,巧妇难为无米之炊啊。

猜你喜欢

转载自blog.csdn.net/weixin_42072754/article/details/109350337