607-销售员

销售员

原文地址:607. 销售员 - 力扣(LeetCode)

  • 题目如下所示

个人题解

这题比较有意思,我当时没注意看题目给出的解释,就直接做了,同时也体现出我个人的 SQL 还是刚处于一个入门的阶段,并不能快速的找到解决办法,直来直往不能快速转弯。具体的个人思路如下 SQL 所示

  • -- 1. 建表
    CREATE TABLE 607_SalesPerSon(
    sales_id INT, -- 销售人员id
    name VARCHAR(20), -- 姓名
    salary INT, -- 工资
    commission_rate INT, -- 佣金率
    hire_date DATE, -- 雇佣日期
    PRIMARY KEY(sales_id)
    );
    CREATE TABLE 607_Company(
    com_id INT, -- 公司ID
    name VARCHAR(20), -- 公司名称
    city VARCHAR(10), -- 公司所在城市
    PRIMARY KEY(com_id)
    );
    CREATE TABLE 607_Orders(
    order_id INT, -- 订单 ID
    order_date DATE, -- 订单日期
    com_id INT, -- 公司 ID
    sales_id INT, -- 销售人员 ID
    amount INT, -- 支付的金额
    PRIMARY KEY(order_id),
    FOREIGN KEY(com_id) REFERENCES 607_company(com_id),
    FOREIGN KEY(sales_id) REFERENCES 607_salesperson(sales_id)
    );
    -- 2. 编写一个 SQL,查询 没有任何与名为 “RED” 的公司相关的订单 的所有销售人员的姓名
    -- 1)查询订单,订单中的 com_id 不为 名为 RED 的公司的 com_id
    -- 1.1) 名为 RED 公司的 com_id
    SELECT com.com_id FROM 607_company com WHERE com.name = "RED";
    -- 1.2) 订单中的 com_id 不为 上述 1.1 查询出来的 id
    SELECT * FROM 607_orders ord WHERE ord.com_id <> (SELECT com.com_id FROM 607_company com WHERE com.name = "RED");
    SELECT ord.sales_id FROM 607_orders ord WHERE ord.com_id <> (SELECT com.com_id FROM 607_company com WHERE com.name = "RED");
    -- 2) 根据订单信息的 sales_id 查询销售人员的姓名
    SELECT * FROM 607_salesperson sp WHERE sp.sales_id IN (SELECT ord.sales_id FROM 607_orders ord WHERE ord.com_id <> (SELECT com.com_id FROM 607_company com WHERE com.name = "RED"));
    -- 总结:上面的分析总共有两点错误!!
    -- 1. 没有将不在订单表中的 销售员 也查出来,因为他们是一定不会跟 “RED” 公司有关联的人员
    -- 2. 没有考虑到在订单表当中由于是一对多的情况,有可能会出现一个人的多个订单当中的某一个订单与 “RED” 公司有关联
    -- 首先我们不妨将错就错,先解决 第一个问题,其实要解决第一个问题很简单,使用外连接稍微改变以下上述的 SQL 即可
    SELECT * from 607_salesperson sp
    LEFT JOIN 607_orders ord
    ON sp.sales_id = ord.sales_id
    WHERE ISNULL(ord.order_id)
    OR ord.com_id NOT IN (SELECT com.com_id FROM 607_company com WHERE com.name = "RED");
    -- 那么我们现在就只需要解决 第二个问题 即可
    -- 稍微想一下,其实题目已经给我们提示了!!!
    -- 有时候,正面很难想出来,那么我们可以反过来试试
    -- 找 com_id 不为 “RED” 公司,我们不如找 com_id 为 “RED”公司 的销售人员的 sales_id,然后我们直接使用 NOT IN 关键字就可以直接解决!!!!!
    SELECT ord.sales_id FROM 607_orders ord WHERE ord.com_id = (SELECT com.com_id FROM 607_company com WHERE com.name = "RED");
    SELECT sp.name FROM 607_salesperson sp WHERE sp.sales_id NOT IN (SELECT ord.sales_id FROM 607_orders ord WHERE ord.com_id = (SELECT com.com_id FROM 607_company com WHERE com.name = "RED")
    );
    -- 如果觉得子查询太多,也可以用外连接或者 where 连接稍微改造一下(内连接也可以)
    SELECT sp.name FROM 607_salesperson sp WHERE sp.sales_id NOT IN (
    SELECT ord.sales_id FROM 607_orders ord, 607_company com WHERE ord.com_id = com.com_id AND com.name = "RED"
    );
    SELECT sp.name FROM 607_salesperson sp WHERE sp.sales_id NOT IN (
    SELECT ord.sales_id FROM 607_orders ord LEFT JOIN 607_company com ON ord.com_id = com.com_id WHERE com.name = "RED"
    );
    -- PS:也可以使用 GROUP BY 的解法,比较麻烦,具体的 SQL 在官方题解下有人有写
posted @   OnlyOnYourself-Lzw  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2022-07-11 05-Nacos注册中心
2022-07-11 04-Ribbon负载均衡
2022-07-11 03-Eureka注册中心
2022-07-11 02-服务拆分和远程调用
2022-07-11 01-微服务的概念
点击右上角即可分享
微信分享提示