Подсчет записей в sql server 2012

#sql-server-2012 #subquery

#sql-server-2012 #подзапрос

Вопрос:

В моей таблице я хочу выяснить, существует ли productid в таблице более одного раза. На самом деле textcode передается как параметр в условии where.

 create table productdetails(productid nvarchar(22),textcode varchar(50),textmessage varchar(50))

INSERT INTO  productdetails VALUES('T0001','M0001','ONE')
INSERT INTO  productdetails VALUES('T0001','M0002','TWO')
INSERT INTO  productdetails VALUES('T0009','M0006','THREE')
INSERT INTO productdetails  VALUES('T0002','M0001','FIVE')
  

если я задаю textcode=’M0001′ в условии where, он выдает productid =’T0001′ И ‘T0002’, я хочу проверить, существуют ли эти productid ‘T0001’ И ‘T0002’ более одного раза в таблице.

Я использовал приведенный ниже запрос.Оптимизирован ли это запрос?или любой другой метод для проверки этого условия.

 SELECT COUNT(PRODUCTID),PRODUCTID FROM productdetails WHERE productid in(SELECT PRODUCTID FROM productdetails WHERE TEXTCODE='M0001') 
GROUP BY PRODUCTID HAVING COUNT(*)>1
  

Ответ №1:

Вы можете использовать условную агрегацию в having предложении для упрощения вашего запроса:

 SELECT COUNT(*), PRODUCTID 
FROM productdetails 
GROUP BY PRODUCTID 
HAVING COUNT(CASE WHEN TEXTCODE='M0001' THEN 1 END) > 0
AND COUNT(*) > 1
  

Этот запрос должен повысить производительность, поскольку вы обращаетесь к таблице только один раз.

Пожалуйста, обратите внимание, что для достижения наилучшей производительности оба запроса, вероятно, могут воспользоваться одним и тем же индексом — индекс для TextCode и ProductID (в таком порядке!) должен способствовать повышению производительности обоих запросов.