LeetCode--607. 销售员

70 阅读2分钟

1 题目描述

表: SalesPerson

+-----------------+---------+  
| Column Name     | Type    |  
+-----------------+---------+  
| sales_id        | int     |  
| name            | varchar |  
| salary          | int     |  
| commission_rate | int     |  
| hire_date       | date    |  
+-----------------+---------+  

sales_id 是该表的主键列 (具有唯一值的列)
该表的每一行都显示了销售人员的姓名和 ID, 以及他们的工资, 佣金率和雇佣日期

表: Company

+-------------+---------+  
| Column Name | Type    |  
+-------------+---------+  
| com_id      | int     |  
| name        | varchar |  
| city        | varchar |  
+-------------+---------+  

com_id 是该表的主键列 (具有唯一值的列)
该表的每一行都表示公司的名称和 ID, 以及公司所在的城市

表: Orders

+-------------+------+  
| Column Name | Type |  
+-------------+------+  
| order_id    | int  |  
| order_date  | date |  
| com_id      | int  |  
| sales_id    | int  |  
| amount      | int  |  
+-------------+------+  

order_id 是该表的主键列 (具有唯一值的列)
com_id 是 Company 表中 com_id 的外键 (reference 列)
sales_id 是来自销售员表 sales_id 的外键 (reference 列)
该表的每一行包含一个订单的信息. 这包括公司的 ID, 销售人员的 ID, 订单日期和支付的金额

编写解决方案, 找出没有任何与名为**“RED”** 的公司相关的订单的所有销售人员的姓名
任意顺序 返回结果表

2 测试用例

输入:
SalesPerson 表:

+----------+------+--------+-----------------+------------+  
| sales_id | name | salary | commission_rate | hire_date  |  
+----------+------+--------+-----------------+------------+  
| 1        | John | 100000 | 6               | 4/1/2006   |  
| 2        | Amy  | 12000  | 5               | 5/1/2010   |  
| 3        | Mark | 65000  | 12              | 12/25/2008 |  
| 4        | Pam  | 25000  | 25              | 1/1/2005   |  
| 5        | Alex | 5000   | 10              | 2/3/2007   |  
+----------+------+--------+-----------------+------------+  

Company 表:

+--------+--------+----------+  
| com_id | name   | city     |  
+--------+--------+----------+  
| 1      | RED    | Boston   |  
| 2      | ORANGE | New York |  
| 3      | YELLOW | Boston   |  
| 4      | GREEN  | Austin   |  
+--------+--------+----------+  

Orders 表:

+----------+------------+--------+----------+--------+  
| order_id | order_date | com_id | sales_id | amount |  
+----------+------------+--------+----------+--------+  
| 1        | 1/1/2014   | 3      | 4        | 10000  |  
| 2        | 2/1/2014   | 4      | 5        | 5000   |  
| 3        | 3/1/2014   | 1      | 1        | 50000  |  
| 4        | 4/1/2014   | 1      | 4        | 25000  |  
+----------+------------+--------+----------+--------+  

输出:

+------+  
| name |  
+------+  
| Amy  |  
| Mark |  
| Alex |  
+------+  

解释:
根据表 orders 中的订单'3' 和'4', 容易看出只有'John' 和'Pam' 两个销售员曾经向公司'RED' 销售过.
所以我们需要输出表 salesperson 中所有其他人的名字

3 解题思路

  1. 关联查询 CompanyOrders 表, 查询出公司名为 RED 的销售人员信息 sales_id
select o.sales_id  
from Orders as o  
         inner join Company as c on o.com_id = c.com_id  
where c.name = 'RED'  

查询结果

+----------+  
| sales_id |  
+----------+  
|     1    |  
|     4    |  
+----------+  
  1. SalesPerson 表中排除步骤 1 中查询结果
select name  
from SalesPerson  
where sales_id not in (select o.sales_id  
                       from Orders as o  
                                inner join Company as c on o.com_id = c.com_id  
                       where c.name = 'RED')  

查询结果

+------+  
| name |  
+------+  
| Amy  |  
| Mark |  
| Alex |  
+------+