Jak pokazano w sekcji Używanie typowych wyrażeń tabelowych w MSDN, możesz zdefiniować CTE jako:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
i używaj go w następujący sposób:
SELECT <column_list> FROM expression_name;
Powiedzmy, że mam 2 następujące CTE
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Zapytanie wyprowadza takie same wyniki dla obu CTE, jak zapytanie wewnętrzne jest takie samo. Jedyną różnicą między tymi dwoma jest to, że cte2 ma nazwę kolumny ( (name)
) zdefiniowaną w deklaracji.
Kiedy wykonuję oba CTE, nie widzę żadnej różnicy w planie wykonania.
Jestem tylko ciekawy, aby wiedzieć:
- Co to za różnica, jeśli nie podam żadnych nazw kolumn w definicji CTE?
- Dlaczego powinienem / nie powinienem określać nazw kolumn podczas tworzenia CTE?
- Czy przypadkiem wpływa to na plan wykonania zapytania? (O ile widziałem, to nie ma znaczenia.)
źródło
Anegdotycznie wolę nazywać kolumny wewnątrz CTE zamiast wewnątrz klauzuli
WITH CTE (xxx) AS
1 , ponieważ nigdy nie przypadkowo nie dopasujesz nazw do zawartości kolumny.Weźmy na przykład następujący przykład:
Co to wyświetla? Pokazuje zawartość
y
kolumny pod nagłówkiemx
i zawartośćx
kolumny pod nagłówkiemy
.Dzięki tej realizacji nigdy nie określam nazw kolumn w
(xxx) AS
klauzuli, zamiast tego robię to w następujący sposób:To usuwa wszelkie wątpliwości dotyczące definicji kolumn.
Na całkowicie niepowiązanym marginesie; zawsze określaj nazwę schematu, odwołując się do nazw obiektów , i zakończ instrukcje średnikiem .
źródło
Ostatecznie każda kolumna potrzebuje prawidłowej nazwy i można ją przypisać na dwa sposoby:
Lista kolumn
Używanie oryginalnych nazw lub aliasów kolumn
Kiedy robisz zarówno alias jak i listę kolumn
Zarówno lista kolumn, jak i aliasy
Jest to podobne do definicji Widoku lub Tabeli pochodnej, w której można również określić listę nazw kolumn.
lista kolumn : Gdy masz wiele skomplikowanych obliczeń, łatwiej jest rozpoznać nazwę, ponieważ nie są one rozproszone w kodzie źródłowym. I jest łatwiej, jeśli masz rekurencyjne cte i możesz przypisać dwie różne nazwy dla tej samej kolumny w punkcie 3.
oryginalna nazwa / aliasy : Musisz przypisać alias tylko, jeśli wykonujesz obliczenia lub chcesz / musisz zmienić nazwę kolumny
źródło
SomeAlias = SomeFunction(SomeColumn)
, z tylko jedną definicją kolumny na wiersz. Umożliwia to proste skanowanie po lewej stronie listy kolumn w celu znalezienia tego, którego szukasz.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Teraz, gdy już o tym wspomniałeś, myślę o takich scenariuszachCREATE 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);
- jaka to by była radość z debugowania!