Wie unter Verwenden allgemeiner Tabellenausdrücke in MSDN gezeigt, können Sie einen CTE wie folgt definieren:
WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )
und benutze es wie:
SELECT <column_list> FROM expression_name;
Angenommen, ich habe folgende 2 CTEs
with cte1 as(
select name from Table1
)
with cte2(name) as(
select name from Table1
)
Eine Abfrage gibt für beide CTEs dieselben Ergebnisse aus wie die innere Abfrage. Der einzige Unterschied zwischen diesen beiden besteht darin, dass in cte2 der Spaltenname ( (name)
) in seiner Deklaration definiert ist.
Wenn ich beide CTEs ausführe, sehe ich keinen Unterschied im Ausführungsplan.
Ich bin nur neugierig zu wissen:
- Welchen Unterschied macht es, wenn ich in der CTE-Definition keine Spaltennamen spezifiziere?
- Warum sollte / sollte ich beim Erstellen von CTE keine Spaltennamen angeben?
- Beeinflusst es zufällig den Ausführungsplan für Abfragen? (Soweit ich gesehen habe, macht es keinen Unterschied.)
quelle
Anekdotisch bevorzuge ich es, die Spalten innerhalb des CTE anstelle der
WITH CTE (xxx) AS
1- Klausel zu benennen , da Sie niemals versehentlich die Namen mit dem Spalteninhalt nicht übereinstimmen.Nehmen Sie zum Beispiel das folgende Beispiel:
Was zeigt das an? Es zeigt den Inhalt der
y
Spalte unter der Überschrift vonx
und den Inhalt derx
Spalte unter der Überschrifty
.Mit dieser Erkenntnis gebe ich niemals die Spaltennamen in der
(xxx) AS
Klausel an, sondern mache es so:Dies beseitigt alle Zweifel an den Spaltendefinitionen.
Auf einer völlig unabhängigen Randnotiz; Geben Sie immer den Schemanamen an, wenn Sie auf Objektnamen verweisen , und beenden Sie Ihre Anweisungen mit einem Semikolon .
quelle
Letztendlich benötigt jede Spalte einen gültigen Namen und Sie können ihn auf zwei Arten zuweisen:
Spaltenliste
Verwenden der ursprünglichen Spaltennamen oder Aliase
Wenn Sie sowohl Alias als auch Spaltenliste ausführen
Sowohl Spaltenliste als auch Aliase
Dies ähnelt der Definition einer Ansicht oder einer abgeleiteten Tabelle, in der Sie auch eine Liste von Spaltennamen angeben können.
Spaltenliste : Wenn Sie viele komplexe Berechnungen haben, ist es einfacher, den Namen zu erkennen, da diese nicht im Quellcode verstreut sind. Und es ist einfacher, wenn Sie ein rekursives cte haben und Sie können zwei verschiedene Namen für dieselbe Spalte in # 3 zuweisen.
ursprünglicher Name / Aliase : Sie müssen nur dann einen Alias zuweisen, wenn Sie eine Berechnung durchführen oder eine Spalte umbenennen möchten / müssen
quelle
SomeAlias = SomeFunction(SomeColumn)
, mit nur einer Spaltendefinition pro Zeile. Dies ermöglicht einen einfachen Scan auf der linken Seite der Spaltenliste, um die gesuchte zu finden.CREATE VIEW SomeView (ColA, ColB, …) AS …
. Nachdem Sie das angesprochen haben, denke ich an Szenarien wieCREATE 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);
- was für eine Freude das zu debuggen wäre!