Каковы основные различия между таблицами CTE и TEMP?

Можно ли использовать CTE (общие табличные выражения) вместо использования временных таблиц.

Я прошел тестирование производительности между ними обоими, но я не могу найти много разницы между ними. Каковы некоторые плюсы и минусы использования CTE'S?

Ответ 1

Вероятно, самое большое различие между CTE и временной таблицей состоит в том, что CTE имеет область выполнения одиночного SELECT, INSERT, UPDATE, DELETE или CREATE VIEW.

По существу, вы не можете повторно использовать CTE, как вы можете, используя временные таблицы.

Из документации

Общее табличное выражение (CTE) можно рассматривать как временное набор результатов, определенный в пределах выполнения одного SELECT, INSERT, UPDATE, DELETE или CREATE VIEW. CTE - аналогично производной таблице, поскольку он не сохраняется как объект и длится только на время запроса. В отличие от производной таблицы, CTE может быть саморегуляцией и может ссылаться несколько раз в тот же запрос.

CTE может использоваться для:

  • Создайте рекурсивный запрос. Дополнительные сведения см. В разделе Рекурсивные запросы с использованием общих выражений таблицы.

  • Заменить вид, когда общее использование представления не требуется; то есть вам не нужно сохранять определение в метаданных.

  • Включить группировку по столбцу, полученному из скалярного подзапроса, или функции, которая не является детерминированной или имеет внешний доступ.

  • Ссылка на полученную таблицу несколько раз в том же самом выражении.

Ответ 2

CTE: CTE обозначает выражения Common Table. Он был введен с SQL Server 2005. Он используется для хранения результата сложного подзапроса на временных базах. Его жизнь ограничена текущим запросом. Он определяется с помощью оператора WITH. Он в основном используется для рекурсивного вызова.

Пример

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA
    inner join myCTE on MHA.ParentID = myCTE.ChildID
    where MHA.ParentID <> 0
)

(ошибка)

select top (5) * from myCTE

поэтому в приведенном выше примере я создаю имя CTE как myCTE, которое может использоваться только в вышеприведенном запросе (я не могу использовать сторону myCTE выше запроса)

TEMP: Он также используется для хранения результата запроса на временных базах. Но его жизнь ограничена текущим сеансом. Он определяется с помощью #. Он не поддерживает рекурсивный.

Пример:

select * into #tempTable from MHA

В предыдущем запросе я создал временную таблицу, теперь я могу использовать ее в таблице temp из этого запроса, но с сессией. См. Ниже

(без ошибок)

select top (5) * from #tempTable