组合两个表-力扣

核心思路

核心思路是使用左连接(LEFT JOIN)将 Person 表和 Address 表进行关联。

这个思路的出发点是题目要求:必须返回 Person 表中的所有记录,即使某个 personId 在 Address 表中没有对应的地址信息。当 Address 表中没有匹配项时,其对应的 City 和 State 字段应显示为 NULL。这正是左连接(LEFT JOIN)的标准行为。

原理

表连接的概念:SQL 中的 JOIN 用于将两个或多个表中的行组合起来,基于相关列之间的关系。

左连接(LEFT JOIN)的工作原理:

LEFT JOIN 会返回左表(LEFT JOIN 关键字左边的表)的所有行。

对于左表中的每一行,它会去右表(LEFT JOIN 关键字右边的表)中查找满足 ON 条件的行。

如果找到了匹配的行,则将右表中匹配行的列数据合并到结果中。

如果没有找到匹配的行,结果中来自右表的列将被填充为 NULL。

在这个问题中:

左表是 Person 表。

右表是 Address 表。

连接条件是 Person.PersonId = Address.PersonId。

因此,查询会遍历 Person 表中的每一个人:

如果这个人在 Address 表中有记录(即 PersonId 匹配),就把对应的 City 和 State 显示出来。

如果这个人在 Address 表中没有记录,City 和 State 字段就显示为 NULL。

方法

实现该思路的具体方法是编写一条包含 LEFT JOIN 的 SQL 查询语句。

sql

SELECT

p.FirstName,

p.LastName,

a.City,

a.State

FROM

Person p

LEFT JOIN

Address a ON p.PersonId = a.PersonId;

代码分解说明:

SELECT p.FirstName, p.LastName, a.City, a.State

指定了最终输出结果需要包含的列。

p 和 a 是表的别名(Alias),分别代表 Person 和 Address,使用别名可以使代码更简洁易读。

FROM Person p

指定了查询的主表或左表是 Person 表。

LEFT JOIN Address a ON p.PersonId = a.PersonId

LEFT JOIN Address a: 声明要进行左连接,并指定右表是 Address 表。

ON p.PersonId = a.PersonId: 这是连接的条件。它告诉数据库如何匹配两个表中的行 ------ 即当 Person 表的 PersonId 与 Address 表的 PersonId 相同时,这两行是匹配的。

优点

使用 LEFT JOIN 来解决这个问题具有以下优点:

逻辑精确:完美地符合了题目的所有要求,特别是 "必须包含所有人员信息" 这一关键条件。

效率高:数据库的查询优化器对 JOIN 操作进行了高度优化。对于有索引的关联字段(如 PersonId),LEFT JOIN 的执行效率非常高。

代码简洁、可读性强:LEFT JOIN 是 SQL 的标准语法,任何熟悉 SQL 的开发者都能立刻理解其意图,代码意图清晰明了。

健壮性好:能够优雅地处理数据不完整的情况(即有些人没有地址),自动将缺失的字段填充为 NULL,而不会因为数据不匹配而丢失信息或报错。

结论

对于 "查询主表所有信息,并关联副表信息,如果副表没有匹配则显示为 NULL" 这类问题,左连接(LEFT JOIN)是最直接、最高效且最标准的解决方案。

通过本问题,我们可以得出一个通用结论:当需要以一个表为基础,去匹配另一个表的数据,并且不希望因为另一个表中没有对应记录而丢失基础表的数据时,就应该优先考虑使用 LEFT JOIN。

相关推荐
天选之女wow6 小时前
【代码随想录算法训练营——Day32】动态规划——509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
算法·leetcode·动态规划
红衣小蛇妖7 小时前
LeetCode-704-二分查找
java·算法·leetcode·职场和发展
QiZhang | UESTC7 小时前
JAVA算法练习题day27
java·开发语言·c++·算法·leetcode·hot100
如竟没有火炬12 小时前
LRU缓存——双向链表+哈希表
数据结构·python·算法·leetcode·链表·缓存
爱编程的化学家14 小时前
代码随想录算法训练营第27天 -- 动态规划1 || 509.斐波那契数列 / 70.爬楼梯 / 746.使用最小花费爬楼梯
数据结构·c++·算法·leetcode·动态规划·代码随想录
海琴烟Sunshine14 小时前
leetcode 66.加一 python
python·算法·leetcode
一只鱼^_17 小时前
力扣第470场周赛
数据结构·c++·算法·leetcode·深度优先·动态规划·启发式算法