Выберите клиентов, которые не имеют значения в другой таблице с объединением - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно выбрать все Customer s из таблицы Customer, где Value в таблице Customer_Value не равно 4. Клиенты:

 +------------+-------+
 | Customer   | ...   |
 +------------+-------+
 | 312        | ...   |
 | 345        | ...   |
 | 678        | ...   |
 +------------+-------+

Customer_Value:

 +------------+-------+
 | Customer   | Value |
 +------------+-------+
 | 312        | 1     |
 | 312        | 2     |
 | 345        | 1     |
 | 345        | 2     |
 | 345        | 3     |
 | 678        | 1     |
 | 678        | 2     |
 | 678        | 4     |
 +------------+-------+

Чтобы получить мой результат, я использовал следующий запрос:

SELECT C.Customer FROM [Customer] C
Left join Customer_Value V ON (C.Customer = V.Customer)
WHERE C.Customer NOT IN (SELECT Customer FROM [Customer_Value] WHERE Value = '4')
GROUP BY C.Customer

Итак, мой вопрос:

Это быстрый и хороший запрос? Или есть другие лучшие решения для получения всех идентификаторов клиентов?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Я бы сделал

select * from customer c
join (
select distinct customer from customer_value where value!=4) v on c.customer = v.customer
0 голосов
/ 26 июня 2018

Вы можете избежать отрицательного условия, используя Left Join и IS NULL Filter, где Condition.

SELECT C.Customer FROM [Customer] C
Left join Customer_Value V ON (C.Customer = V.Customer) and V.Value = '4'
WHERE V.Value is null
GROUP BY C.Customer
0 голосов
/ 26 июня 2018

Ваш метод излишний; JOIN не обязательно. Я бы использовал not exists:

select c.Customer 
from Customer c
where not exists (select 1
                  from customer_value cv
                  where c.Customer = v.Customer and
                        cv.value = 4
                 );

Вы также можете использовать агрегацию, если предположите, что у всех клиентов есть хотя бы одна строка в customer_value:

select cv.customer
from customer_value cv
group by cv.customer
having sum(case when cv.value = 4 then 1 else 0 end) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...