组合两个表-力扣

核心思路

核心思路是使用左连接(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。

相关推荐
TracyCoder1232 小时前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
踩坑记录3 小时前
leetcode hot100 94. 二叉树的中序遍历 easy 递归 dfs
leetcode
醉颜凉5 小时前
【LeetCode】打家劫舍III
c语言·算法·leetcode·树 深度优先搜索·动态规划 二叉树
达文汐5 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗5 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
User_芊芊君子5 小时前
【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
算法·leetcode·职场和发展
培风图南以星河揽胜5 小时前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
算法_小学生5 小时前
LeetCode 热题 100(分享最简单易懂的Python代码!)
python·算法·leetcode
执着2595 小时前
力扣hot100 - 234、回文链表
算法·leetcode·链表
熬夜造bug5 小时前
LeetCode Hot100 刷题路线(Python版)
算法·leetcode·职场和发展