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 @ 2023-07-11 15:19  OnlyOnYourself-Lzw  阅读(15)  评论(0编辑  收藏  举报