CTE schafft nicht alles 'echtes'. Sie sind lediglich ein Sprache Element, eine Möglichkeit, einen Tabellenausdruck auszudrücken, der wiederholt in einer Anweisung verwendet wird. Wenn Sie sagen,
WITH cteFoo AS (select ... from table where ...)
select ... from cteFoo where ...
sagen
nur ein weiterer Weg ist
select ... from (select ... from table where ....) as cteFoo where ...
CTE und abgeleitete Tabellen sind sehr ähnlich, jede Abfrage abgeleitete Tabellen verwendet als CTE rewriten werden kann, und jede nicht-rekursive CTE kann unter Verwendung von abgeleiteten Tabellen als Abfrage umgeschrieben werden. Persönlich bevorzuge ich das CTE-Formular, da es prägnanter und leichter zu lesen ist.
CTEs ermöglichen ein Tabellenausdruck mehrfach verwendet nur einmal erklären:
WITH cte AS (select ... from table where ...)
select ...
from cte a join cte b on ...
where ...
dies vergleichen mit der semantisch ähnlicher Form abgeleitete Tabelle:
select ...
from (
select ... from table where ...) as a
join (
select ... from table where ...) as b
on ...
where ...
Der CTE deutlich besser lesbar ist. Aber Sie müssen verstehen, dass die beiden Formulare die gleiche Abfrage erzeugen. Das CTE-Formular könnte vorschlagen, dass ein Zwischenergebnis erstellt wird, dann wird der Join auf dem Zwischenergebnis ausgeführt, aber das ist nicht wahr. Das CTE-Formular wird genau in die gleiche Form wie die abgeleitete Tabelle 1 kompiliert, was deutlich macht, dass die Tabellenausdruck der CTE zweimal ausgeführt wird.
Dies ist ein gutes Beispiel dafür, warum wir alle Semikola in unserem T-SQL verwenden sollten. Wenn Sie ';' nach den UPDATE- und DELETE-Anweisungen richtig platzieren, wird klar, dass der CTE Teil der UPDATE-Anweisung ist. – NReilingh