美文网首页
[SQL] LeetCode题解 #175 组合两个表

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

作者: 半为花间酒 | 来源:发表于2020-05-01 10:50 被阅读0次

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

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒)
    若公众号内转载请联系公众号:早起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平台数据库的第一道题,也是最简单的一道题
    今后其他题目我会尽可能给出多种解法,欢迎交流学习

    相关文章

      网友评论

          本文标题:[SQL] LeetCode题解 #175 组合两个表

          本文链接:https://www.haomeiwen.com/subject/cfvfghtx.html