Лучший способ избежать повторных вложенных запросов в операторе выбора SQL - PullRequest
2 голосов
/ 20 июня 2019

Я использую хранимую процедуру SQL для извлечения данных из моей базы данных. Поскольку я использую несколько подзапросов, скорость запроса очень низкая, пожалуйста, предложите лучший способ переписать приведенный ниже запрос, чтобы избежать подзапроса.

    Select Companyid, 
           companyname, 
          (select count(distinct Identifier.SID) 
                  from CompaniesUsers   
                  join Identifier on CompaniesUsers.UniqueId = Identifier.UniqueId  
                 where Companies.CompanyId = CompaniesUsers.CompanyId 
                 and CompaniesUsers.IsActive = 1 
                 and Identifier.IsActive = 1 ) as CustomerCount,
         (select count(distinct CompaniesUsers.UniqueId) 
                 from CompaniesUsers    
                 where Companies.CompanyId = CompaniesUsers.CompanyId    
                 and CompaniesUsers.IsActive = 1 
                 and CompaniesUsers.UniqueId != '-'     )
         -      (Same query used in the CustomerCount) as AnonymousCustomerCount        
         from Companies where Companies.isactive = 1

Здесь я хочу повторно использовать запрос подсчета клиентов для AnonymousCustomerCount. Каков наилучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы должны иметь возможность использовать общее табличное выражение, чтобы упростить чтение запроса:

with 
 customer_count as 
   (select query with joining of 2 tables), 
 user_count as
   (Subquery to get total count by joining 2 tables)

Select Companyid,
companyname,
customer_count.column_name, 
customer_count.column_name - user_count.column_name
from CompanyTable
join customer_count on ?
join user_count on ?

Не уверен, что это улучшит производительность, хотя ...

1 голос
/ 20 июня 2019

Попробуйте Outer Apply и посмотрите, работает ли он для вас:

Select Companyid,
companyname,
CustomerCount.Count,
TotalCount.Total - CustomerCount.Count as AnonymousCustomerCount
from CompanyTable
OUTER APPLY (
select Count
  joining of 2 tables
) AS CustomerCount
OUTER APPLY (
  Subquery Total to get total count by joining 2 tables
) AS TotalCount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...