Я начал читать о Common Table Expression и не могу вспомнить случай использования, когда мне нужно было бы их использовать. Они кажутся избыточными, как то же самое можно сделать с производными таблицами. Я что-то упускаю или плохо понимаю? Может ли кто-нибудь дать мне простой пример ограничений с помощью регулярных запросов на выборку, производную или временную таблицу, чтобы привести случай CTE? Любые простые примеры будут высоко оценены.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Я использую их для разбиения сложных запросов, особенно сложных объединений и подзапросов. Я обнаружил, что все больше и больше использую их в качестве «псевдо-представлений», чтобы помочь мне понять смысл запроса.
Моя единственная жалоба на них - они не могут быть повторно использованы. Например, у меня может быть сохраненный процесс с двумя операторами обновления, которые могут использовать один и тот же CTE. Но «область действия» CTE - это только первый запрос.
Проблема в том, что «простые примеры», вероятно, на самом деле не нуждаются в CTE!
Тем не менее, очень удобно.
источник
VIEW
:)Есть две причины, по которым я вижу использование cte.
Использовать вычисленное значение в предложении where. Это кажется немного чище, чем производная таблица.
Предположим, есть две таблицы - Вопросы и Ответы, объединенные при помощи Вопросов.ID = Ответы.Question_Id (и идентификатор теста)
Вот еще один пример, где я хочу получить список вопросов и ответов. Я хочу, чтобы ответы были сгруппированы с вопросами в результатах.
источник
HAVING
это еще один способ сделать позднюю стадию фильтра , который может быть похож на использование суб-SELECT
Один из сценариев, который я нашел полезным для использования CTE, - это когда вы хотите получить DISTINCT строки данных, основанные на одном или нескольких столбцах, но вернуть все столбцы в таблице. При стандартном запросе вам, возможно, сначала придется выгрузить отдельные значения во временную таблицу, а затем попытаться соединить их обратно с исходной таблицей, чтобы получить остальные столбцы, или вы можете написать чрезвычайно сложный запрос на разделы, который может вернуть результаты в один запуск, но по всей вероятности, он будет нечитаемым и вызовет проблемы с производительностью.
Но с помощью CTE (как ответил Тим Шмельтер на Выбор первого экземпляра записи )
Как видите, это намного легче читать и поддерживать. И по сравнению с другими запросами, намного лучше в производительности.
источник
Возможно, более целесообразно думать о CTE как о замене представления, используемого для одного запроса. Но не требует накладных расходов, метаданных или постоянства формального представления. Очень полезно, когда вам нужно:
Вот пример вырезания и вставки для игры:
наслаждаться
источник
Сегодня мы собираемся узнать о выражении Common table, которое является новой функцией, которая была введена в SQL Server 2005 и доступна в более поздних версиях.
Общее табличное выражение: - Общее табличное выражение может быть определено как временный набор результатов или, другими словами, является заменой представлений в SQL Server. Общее табличное выражение допустимо только в пакете оператора, где оно было определено, и не может использоваться в других сеансах.
Синтаксис объявления CTE (общее табличное выражение): -
Давайте возьмем пример:
Я создал две таблицы сотрудника и отдела и вставил 5 строк в каждую таблицу. Теперь я хотел бы объединить эти таблицы и создать временный набор результатов для дальнейшего использования.
Давайте возьмем каждую строку утверждения одну за другой и поймем.
Чтобы определить CTE, мы пишем предложение «with», затем даем имя табличному выражению, здесь я дал имя как «CTE_Example»
Затем мы пишем «как» и заключаем наш код в две скобки (---), мы можем объединить несколько таблиц в заключенных в скобки.
В последней строке я использовал «Select * from CTE_Example», мы ссылаемся на выражение «Общая таблица» в последней строке кода, поэтому мы можем сказать, что это похоже на представление, где мы определяем и используем представление в одном Пакет и CTE не хранятся в базе данных как постоянный объект. Но это ведет себя как представление. мы можем выполнить оператор удаления и обновления для CTE, и это будет иметь прямое влияние на таблицу ссылок, которые используются в CTE. Давайте возьмем пример, чтобы понять этот факт.
В приведенном выше заявлении мы удаляем строку из CTE_Example, и она удаляет данные из ссылочной таблицы «DEPT», которая используется в CTE.
источник
Это очень полезно, когда вы хотите выполнить «заказанное обновление».
MS SQL не позволяет использовать ORDER BY с UPDATE, но с помощью CTE вы можете сделать это следующим образом:
Посмотрите здесь для получения дополнительной информации: Как обновить и заказать с помощью MS SQL
источник
Одна точка, еще не указанная, это скорость . Я знаю, что это старый ответ на вопрос, но я думаю, что это заслуживает прямого комментария / ответа:
Когда я впервые использовал CTE, я был совершенно ошеломлен его скоростью. Это был случай, подобный учебнику, очень подходящий для CTE, но во всех случаях, когда я когда-либо использовал CTE, было значительное увеличение скорости. Мой первый запрос был сложным с производными таблицами и занимал долгие минуты. С CTE это заняло доли секунды и шокировало меня, что это даже возможно.
источник
попробуй это
источник