大家好,
从今天起我们将对Leetcode中数据库相关题目进行讲解,如果对SQL相关操作还不是很了解的读者可以点击万字Mysql学习笔记复习。


通过做题来学习是最有效的方式,阅读的同时一定要思考每种解法的异同,最好能够敲一遍。

本文为第175题:组合两个表




01

题目与SQL架构


Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255));
Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255));
Truncate table Person;
insert into Person (PersonId, LastName, FirstName) values ('1''Wang''Allen');
Truncate table Address;
insert into Address (AddressId, PersonId, City, State) values ('1''2''New York City''New York');


02

第一种解法


从题意上判断很简单,无论person是否有地址信息,说明地址信息(City, State)的查询结果允许为NULL。但是,姓名(FirstName, LastName)必须有

直观的解法是基于Person表的左连接。

注:写SQL语句的时候尽量按照执行顺序去写

FROM...
JOIN...
ON...
WHERE...
GROUP BY...
SELECT...
HAVING...
ORDER BY...
LIMIT...

先给出最简单直接的解法:

SELECT P.FirstName, P.LastName, A.City, A.State
FROM Person P 
LEFT JOIN Address A
ON P.PersonID = A.PersonID



03

第二种解法


另一种解法是将Address换成子查询临时

SELECT P.FirstName, P.LastName, A.City, A.State
FROM Person P
LEFT JOIN (SELECT DISTINCT PersonId, City, State 
           FROM Address) A
on P.PersonId = A.PersonId;

这种解法针对于大数据、建立合适索引的情况下速度会加快,但是如果数据量太小,由于子查询会再产生临时表,有时候执行速度不一定有提升,见仁见智主流的做法就是JOIN连表,如果用WHERE或者建立多个子查询也可以解决这道题。个人认为相对而言意义偏小。


©著作权归作者所有:来自51CTO博客作者mb5fe18e32e4691的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 一道Leetcode数据库题的三种解法|文末送书
  2. 解答、收录了 8 道 MyBatis 的题目
  3. JavaScript的two-sum问题解法
  4. python题目——认识*与**,判断函数输出
  5. 牛客网上的题总结下 python解法
  6. 嵌入式或LINUX相关研发面试题目
  7. 面试程序员SQL题目?哪位大哥大姐帮我看看 这怎么做? 谢谢
  8. 软件大赛题目----(第一个)Java

随机推荐

  1. android之interpolator的用法详解
  2. Android 动画的重复播放
  3. Android中常用的五种布局
  4. Android MMS,SMS之常用Uri
  5. Android SDK 下载 链接
  6. Android获取视频音频的时长的方法
  7. android如何调用显示和隐藏系统默认的输
  8. Android的一些小问题处理
  9. Android API 中文 (42) —— ListView
  10. Android开源项目第二篇——工具库篇