我正在使用MySQL,并且有三个表:
Table: Salesperson
ID | Name | Age | Salary
1 | Abe | 61 | 140000
2 | Bob | 34 | 44000
5 | Chris| 34 | 40000
7 | Dan | 41 | 52000
8 | Ken | 57 | 115000
11 | Joe | 38 | 38000
Table: Customer
ID | Name | City | Industry_Type
4 | Samsonic | pleasant | J
6 | Panasung | oaktown | J
7 | Samony | jackson | B
9 | Orange | jackson | B
Table: Orders
Number | order_date | cust_id | salesperson_id | Amount
10 | 1996-08-02 | 4 | 2 |540
20 | 1999-01-30 | 4 | 8 |1800
30 | 1995-07-14 | 9 | 1 |460
40 | 1998-01-29 | 7 | 2 |2400
50 | 1998-02-03 | 6 | 7 |600
60 | 1998-03-02 | 6 | 7 |720
70 | 1995-05-06 | 9 | 7 |150
我想查找所有与Samsonic没有任何订单并且至少已下订单1的销售人员的姓名
我的预期结果是:
Name
Abe
Dan
我尝试过:
SELECT Distinct(s.name)
FROM Orders o
INNER JOIN Salesperson s
ON o.salesperson_id = s.ID
INNER JOIN Customer c
ON c.ID = o.cust_id
WHERE s.name NOT IN(
select s.name where c.name='Samsonic'
);
但是我得到的结果是:
Name
Dan
Bob
Abe
我相信Bob出现了,因为他下达了另一个非Samsonic的订单。在仍然连接所有三个表的同时如何获得预期的结果?谢谢!
答案 0 :(得分:0)
在子查询中,您正在引用外部查询中的表。
下面的代码应该可以解决您的问题。
SELECT DISTINCT s.name
FROM salesperson s
INNER JOIN orders o ON s.id = o.salesperson_id
INNER JOIN customer c ON o.cust_id = c.id
WHERE s.name NOT IN (
SELECT s.name
FROM salesperson s
INNER JOIN orders o ON s.id = o.salesperson_id
INNER JOIN customer c ON o.cust_id = c.id
WHERE c.name = 'Samsonic'
);
答案 1 :(得分:0)
有很多方法可以编写这样的查询,但是要提供给定的规范:
我想查找所有与Samsonic没有任何订单并且至少已下订单1的销售人员的姓名
直接映射到:
SELECT s.name
FROM salesperson s
WHERE s.id NOT IN (
SELECT o.salesperson_id
FROM orders o INNER JOIN customer c ON o.cust_id = c.id
WHERE c.name = 'Samsonic')
AND s.id IN (SELECT salesperson_id FROM orders);
主要/外部查询查找销售人员的姓名,第一个子查询删除具有Samsonic订单的销售人员,第二个子查询确保销售人员已完成至少一个订单。