Фильтрация на основе объединения нескольких таблиц в SQL - PullRequest
0 голосов
/ 04 ноября 2018

Я использую 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

Я полагаю, что Боб появляется, так как он сделал другой заказ, который не был Самсоником. Как я могу получить желаемый результат, по-прежнему объединяя все три таблицы? Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Существует много способов написания такого запроса, но заданная спецификация:

Я хочу найти имена всех продавцов, у которых нет заказов с 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, а второй подзапрос проверяет, что продавец сделал хотя бы один заказ.

0 голосов
/ 05 ноября 2018

В вашем подзапросе вы ссылаетесь на таблицы во внешнем запросе.

Код ниже должен исправить вашу проблему.

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'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...