一、问题描述
表: 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
。
以 任意顺序 返回结果表。
题目链接:组合两个表
二、题目要求
样例
输入:
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 的地址信息。
复制代码
考察
三、问题分析
这一题就是一道考察连接基础的问题,我把SQL
里面常见的几种语言列举一下:
A inner join B:内连接,取交集
A left join B:左外连接,取 A 全部,B 没有对应的值,则为null
A right join B:右外连接,取 B 全部,A 没有对应的值,则为null
A full outer join B:全外连接,取并集,彼此没有对应的值为null
这一题,我们看一下题目的要求:两个表 Person
、Address
,如果右侧的地址号未出现在左侧表中,直接置为 null。
那么选择哪一种连接方式,就显而易见了。简单的选择一下左外连接,一下子问题就会迎刃而解
。
四、编码实现
select p.firstName,p.lastName,a.city,a.state
from Person p
left join Address a on p.personId=a.personId
复制代码
五、测试结果
评论