一、问题描述
表: 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.statefrom Person pleft join Address a on p.personId=a.personId
复制代码
五、测试结果
评论