Это мой старый запрос:
Select AccountID,AccountDesc,
CASE
WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)
ELSE cast(cast(CreateDate as date) as varchar)
END
FROM #A P1
WHERE P1.EndDate = (Select max(EndDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
group by P2.AccountID)
and P1.StartDate = (Select max(StartDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
group by P2.AccountID)
and P1.CreateDate = (Select max(CreateDate ) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
group by P2.AccountID)
and P1.NewStartDate= (Select max(NewStartDate) from #A P2 where P1.AccountID = P2.AccountID and P2.Categ1 = 'F'
group by P2.AccountID)
Я хотел избавиться от повторяющихся самосоединений и групповых байтов в предложении where, поэтому я избавился от части "Category1 = F" ивместо этого добавьте его в рабочую таблицу, где вместо этого я добавляю предложение.И я подумал, что самообъединение предназначено только для получения значений MAX, поэтому, поскольку я составил рабочий стол, я не думал, что мне понадобятся эти самообъединения.Итак, я получаю этот новый запрос:
Select AccountID,AccountDesc,
CASE
WHEN NOT EXISTS (select AccountID from #B where #B.AccountID = P1.AccountID) THEN cast(cast(GETDATE() as date) as varchar)
ELSE cast(cast(CreateDate as date) as varchar)
END
FROM #A P1
WHERE P1.EndDate = (Select max(EndDate) from #A)
and P1.StartDate = (Select max(StartDate) from #A)
and P1.CreateDate = (Select max(CreateDate) from #A)
and P1.NewStartDate= (Select max(NewStartDate) from #A)
Но это не возвращает одинаковое количество записей, я полагаю, потому что я также удалил предложения «Группировать по» в условиях where?
Может ли кто-нибудь помочь мне сделать этот оригинальный запрос быстрее, но при этом вернуть те же результаты?