Ответ 1
select case
when exists (select *
from customer
where amount <> 0
and customerid = 22) then 1
else 0
end as non_zero_exists
У меня есть запрос на поиск определенных клиентов из таблицы.
SELECT COUNT(*)
FROM CUSTOMER
WHERE amount <> 0
AND customerid = 22
Существует индекс для customerid, поэтому БД сканирует все строки с customerid = 22.
Поскольку результат обрабатывается путем проверки того, возвращает ли счет нуля или больше нуля, как я могу оптимизировать запрос? То есть так что в первой строке клиента с количеством < > 0 запрос возвращает 0 else, если все строки равны 0, затем возвращают 1.
select case
when exists (select *
from customer
where amount <> 0
and customerid = 22) then 1
else 0
end as non_zero_exists
Первый индекс для клиента и суммы
CREATE INDEX customer_idx ON customer(customerid, amount);
затем перепишите свой запрос как
IF EXISTS (SELECT customerid
FROM customer
WHERE amount > 0 -- I am assuming here that amount cannot be a negative number.
AND customerid = 22)
SELECT 1
ELSE
SELECT 0
Это приведет к поиску индекса на customer_idx. В противном случае вам нужно будет сканировать все строки для этого клиента (что, по-видимому, может быть связано с вашим вопросом).
Кажется, достаточно прямо вперед
IF EXISTS ( SELECT customerid
FROM customer
WHERE amount <> 0
and customerid = 22))
SELECT 1
ELSE
SELECT 0
Альтернатива EXISTS
select ISNULL((select TOP 1 1
from customer
where amount <> 0
and customerid = 22),0)
Я уже предполагал, что у вас будет указатель на (customerid) или лучше (customerid, amount).