专栏名称: 半为花间酒
陈熹,中山大学中山眼科中心博士在读 研究...
目录
相关文章推荐
四川发布  ·  2024级“新生”大熊猫,给您拜!年!啦! ·  昨天  
四川发布  ·  四川,咔咔角角都得行! ·  昨天  
创伙伴  ·  拿捏老外的100个中国APP ·  2 天前  
自贡网  ·  富顺交通要道+1! ·  3 天前  
自贡网  ·  “爆改”命运的,不是胖东来 ·  3 天前  
51好读  ›  专栏  ›  半为花间酒

[SQL] Leetcode题解 #175 组合两个表

半为花间酒  · 简书  ·  · 2020-05-01 10:50

正文

对SQL语句不熟悉欢迎查看我整理的笔记: [SQL] MySQL基础 + python交互

转载请注明 :陈熹 [email protected] (简书号:半为花间酒)
若公众号内转载请联系公众号:早起Python

题目

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');

题解

- 第一种解法

从题意上判断很简单, 无论 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

- 第二种解法

另一种解法是将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或者建立多个子查询 也可以解决这道题

个人认为相对而言意义偏小

这是Leetcode平台数据库的第一道题,也是最简单的一道题
今后其他题目我会尽可能给出多种解法,欢迎交流学习