基于在SQL中联接多个表进行过滤

时间:2018-11-04 20:41:30

标签: mysql sql join

我正在使用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的订单。在仍然连接所有三个表的同时如何获得预期的结果?谢谢!

2 个答案:

答案 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订单的销售人员,第二个子查询确保销售人员已完成至少一个订单。