#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 (в таком порядке!) должен способствовать повышению производительности обоих запросов.