Почему рекурсивные CTE не могут использовать группировки и другие предложения? - PullRequest
2 голосов
/ 11 октября 2010

Недавно я узнал о рекурсивных выражениях общих таблиц (CTE), когда искал способ создания определенного представления некоторых данных.Потратив некоторое время на то, чтобы написать, как будет работать первая итерация моего запроса, я превратил его в CTE, чтобы посмотреть, как все это закончится.Я был удивлен, увидев, что группировка не работает, поэтому я просто заменил ее на «Выберите TOP 1, ORDER BY».Я был снова удивлен, что «TOP» не был разрешен, и пришел к выводу, что все эти пункты не разрешены в рекурсивной части CTE:

  • DISTINCT
  • GROUP BY
  • HAVING
  • TOP
  • LEFT
  • RIGHT
  • OUTER JOIN

Итак, я полагаюУ меня есть 2 вопроса:

  1. Чтобы лучше понять мою ситуацию и SQL, почему эти пункты не разрешены?
  2. Если мне нужно выполнить какую-то рекурсию, используя некоторые изэти пункты, моя единственная альтернатива для написания рекурсивной хранимой процедуры?

Спасибо.

1 Ответ

2 голосов
/ 11 октября 2010

Ссылаясь на: -

  1. Чтобы лучше понять мою ситуацию и SQL, почему эти пункты не разрешены?

Исходя из моего понимания CTE, вся идея создания CTE заключается в том, чтобы вы могли создать временный набор результатов и использовать его в с именем , как обычная таблица в SELECT, INSERT, UPDATE или DELETE заявления.

Поскольку CTE логически очень похож на представление, оператор SELECT в вашем запросе CTE должен соответствовать тем же требованиям, которые использовались для создания представления. См. Раздел ** Определения запросов CTE * в следующей ссылке на MSDN

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

С учетом

2.Если мне нужно выполнить какую-то рекурсию с использованием некоторых из этих предложений, является ли моя единственная альтернатива написанию рекурсивной хранимой процедуры?

Кроме того, я вполне уверен, что вы можете использовать по крайней мере некоторые из ключевых слов, которые вы упомянули выше в представлении / CTE select . Например: Обратитесь к использованию GROUP BY в CTE здесь в примере создания простого общего табличного выражения

Может быть, если вы можете предоставить пример сценария того, чего вы пытаетесь достичь, мы можем предложить какое-то возможное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...