Как показано в разделе Использование общих табличных выражений в MSDN, вы можете определить CTE как:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
и используйте это как:
SELECT <column_list> FROM expression_name;
Допустим, у меня есть следующие 2 CTE
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Запрос выводит одинаковые результаты для обоих CTE, поскольку внутренний запрос одинаков. Единственная разница между этими двумя заключается в том, что cte2 имеет имя столбца ( (name)
), определенное в его объявлении.
Когда я выполняю оба CTE, я не вижу никакой разницы в плане выполнения.
Мне просто интересно узнать:
- Какая разница, если я не указываю имена столбцов в определении CTE?
- Почему я должен / не должен указывать имена столбцов при создании CTE?
- Повлияло ли это на план выполнения запроса случайно? (Насколько я видел, это не имеет никакого значения.)
источник
К счастью, я предпочитаю называть столбцы внутри CTE, а не внутри предложения
WITH CTE (xxx) AS
1 , так как вы никогда не ошибочно совпали с именами и содержимым столбцов.Возьмем, к примеру, следующий пример:
Что это показывает? Он показывает содержимое
y
столбца под заголовкомx
и содержимоеx
столбца под заголовкомy
.С этой реализацией я никогда не указываю имена столбцов в
(xxx) AS
предложении, вместо этого я делаю это так:Это устраняет все сомнения относительно определения столбца.
На совершенно не связанной стороне; всегда указывайте имя схемы при обращении к именам объектов и заканчивайте свои операторы точкой с запятой .
источник
В конечном счете, каждому столбцу нужно правильное имя, и вы можете назначить его двумя способами:
Список столбцов
Использование оригинальных имен столбцов или псевдонимов
Когда вы делаете и псевдоним и список столбцов
Список столбцов и псевдонимы
Это похоже на определение представления или производной таблицы, где вы также можете указать список имен столбцов.
список столбцов : когда у вас много сложных вычислений, легче определить имя, потому что они не разбросаны по исходному коду. И это проще, если у вас есть рекурсивный cte, и вы можете назначить два разных имени для одного и того же столбца в # 3.
исходное имя / псевдонимы : псевдоним необходимо назначать только в том случае, если вы выполняете вычисления или хотите / должны переименовать столбец
источник
SomeAlias = SomeFunction(SomeColumn)
, с одним определением столбца на строку. Это позволяет просто сканировать в левой части списка столбцов, чтобы найти тот, который вы ищете.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Теперь, когда вы подняли этот вопрос, я думаю о таких сценариях, какCREATE VIEW MyView (G) AS WITH cte (C) AS (SELECT A AS B FROM MyTable) SELECT E AS F FROM (SELECT C AS D FROM cte) AS s (E);
это было бы приятно для отладки!