607-销售员
销售员
- 题目如下所示
个人题解
这题比较有意思,我当时没注意看题目给出的解释,就直接做了,同时也体现出我个人的 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 在官方题解下有人有写
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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-微服务的概念