一、问题描述
表: 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 的外键。sales_id 是来自销售员表 sales_id 的外键。该表的每一行包含一个订单的信息。这包括公司的 ID 、销售人员的 ID 、订单日期和支付的金额。
复制代码
编写一个 SQL 查询,报告没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名。
以 任意顺序 返回结果表。
题目链接:销售员
二、题目要求
样例
输入: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 中所有其他人的名字。
复制代码
考察
1.查询语句、连接问题2.建议用时10~25min
复制代码
三、问题分析
1.子查询
第一种方法是比较普通,容易想到的方式。
我们可以先在Company 和Orders 两个表中筛选出符合题目条件的id编号,最后加上一步判断SalesPerson里面的编号只要不在子条件语句里里面就可以了。
2.左连接
我们通过left join语句先进行左连接,结果如下图所示:
| order_id | date | com_id | sales_id | amount | com_id | name | city ||----------|----------|--------|----------|--------|--------|------|--------|| 3 | 3/1/2014 | 1 | 1 | 50000 | 1 | RED | Boston || 4 | 4/1/2014 | 1 | 4 | 25000 | 1 | RED | Boston |
复制代码
其实看到上面的表,剩下的步骤其实就是判断SalesPerson表的是不是sales_id 是不是在上面的表中出现过。
四、编码实现
1.子查询
select s.namefrom SalesPerson swhere s.sales_id not in( select o.sales_id from Company c,Orders o where c.name='RED' and c.com_id=o.com_id)
复制代码
2.左连接
select s.namefrom SalesPerson swhere s.sales_id not in( select o.sales_id from Orders o left join Company c on c.com_id=o.com_id where c.name='RED')
复制代码
五、测试结果
评论