Избегание использования временной таблицы с помощью подзапросов

#sql #tsql #sql-server-2017

Вопрос:

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

 select id,COUNT (id)as Attempts
into #tmp
from Table1
where State in ('SD')
and Date >=  cast( GETDATE() -7 as date )
group by Accountid having COUNT (accountid) > 2

select *
from #tmp a join Table1 b on a.id= b.id
and b.Date >=  cast( GETDATE() -7 as date )
where CAST(Date as date) = cast(GETDATE()-1 as date)
order by a.id,b.Date 
 

Есть ли способ получить этот результат всего за один запрос?

Комментарии:

1. Что ты пытаешься сделать? Пожалуйста, предоставьте примерные данные, желаемые результаты и четкое объяснение. Возможно, существует более простой подход.

2. Есть ли для этого какая-то конкретная причина? Очень часто добавление временной таблицы (она же «разделяй и властвуй») является более эффективным вариантом по множеству причин.

3. Причина, по которой я хотел пропустить использование временной таблицы, заключается в том, что это не работает в Power BI. Единственный способ заставить его работать-это использовать подзапрос, как показано ниже.

4. Хорошо, это оправданная причина 🙂

5. Обратите внимание, что CAST(Date as date) = cast(GETDATE()-1 as date) это неправильно оплачивается. Date >= CAST(DATEADD(day, -1, GETDATE()) AS date) AND Date < CAST(GETDATE() AS date) вероятно, более эффективно

Ответ №1:

Замените #tmp во втором запросе первый запрос, заключенный в скобки, как в:

 select *
from (
  select id,COUNT (id) as Attempts
  from Table1
  where State in ('SD')
  and Date >=  cast( GETDATE() -7 as date )
  group by Accountid having COUNT (accountid) > 2
) a join Table1 b on a.id= b.id
and b.Date >=  cast( GETDATE() -7 as date )
where CAST(Date as date) = cast(GETDATE()-1 as date)
order by a.id,b.Date 
 

Первый запрос становится «табличным выражением».