BEARBEITEN:
Bitte beachten Sie Martins Kommentare unten:
Der CTE wird nicht als Tabelle im Speicher gespeichert. Es ist nur eine Möglichkeit, eine Abfragedefinition zu kapseln. Im Falle des OP wird es eingeblendet und genauso, wie es gerade getan wird SELECT Column1, Column2, Column3 FROM SomeTable
. Meistens werden sie nicht im Voraus materialisiert, weshalb dies keine Zeilen zurückgibt. WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
Überprüfen Sie auch die Ausführungspläne. Obwohl es manchmal möglich ist, den Plan zu hacken, um eine Spule zu bekommen. Es gibt ein Verbindungselement, das einen Hinweis dazu anfordert. - Martin Smith 15. Februar 12 um 17.08 Uhr
Ursprüngliche Antwort
CTE
Lesen Sie mehr über MSDN
Ein CTE erstellt die im Speicher verwendete Tabelle, ist jedoch nur für die darauf folgende spezifische Abfrage gültig. Bei Verwendung der Rekursion kann dies eine effektive Struktur sein.
Möglicherweise möchten Sie auch eine Tabellenvariable verwenden. Dies wird als temporäre Tabelle verwendet und kann mehrmals verwendet werden, ohne dass für jeden Join eine erneute Materialisierung erforderlich ist. Wenn Sie jetzt ein paar Datensätze beibehalten müssen, nach der nächsten Auswahl ein paar weitere Datensätze hinzufügen, nach einer weiteren Operation ein paar weitere Datensätze hinzufügen und dann nur eine Handvoll Datensätze zurückgeben möchten, kann dies eine praktische Struktur sein, wie es nicht der Fall ist muss nach der Ausführung nicht gelöscht werden. Meist nur syntaktischer Zucker. Wenn Sie jedoch die Zeilenanzahl niedrig halten, wird sie niemals auf der Festplatte gespeichert. Siehe Was ist der Unterschied zwischen einer temporären Tabelle und einer Tabellenvariablen in SQL Server? für mehr Details.
Temp-Tabelle
Lesen Sie mehr über MSDN - Scrollen Sie etwa 40% des Weges nach unten
Eine temporäre Tabelle ist im wahrsten Sinne des Wortes eine Tabelle, die auf der Festplatte erstellt wurde und nur in einer bestimmten Datenbank gelöscht werden kann, von der jeder weiß, dass sie gelöscht werden kann. Es liegt in der Verantwortung eines guten Entwicklers, diese Tabellen zu zerstören, wenn sie nicht mehr benötigt werden. Ein DBA kann sie jedoch auch löschen.
Temporäre Tabellen gibt es in zwei Varianten: lokal und global. In Bezug auf MS SQL Server verwenden Sie eine #tableName
Bezeichnung für lokal und eine ##tableName
Bezeichnung für global (beachten Sie die Verwendung eines einfachen oder doppelten # als identifizierendes Merkmal).
Beachten Sie, dass Sie mit temporären Tabellen im Gegensatz zu Tabellenvariablen oder CTE Indizes und dergleichen anwenden können, da dies im normalen Sinne des Wortes legitime Tabellen sind.
Im Allgemeinen würde ich temporäre Tabellen für längere oder größere Abfragen und CTEs oder Tabellenvariablen verwenden, wenn ich bereits einen kleinen Datensatz hätte und einfach schnell ein bisschen Code für etwas Kleines schreiben wollte. Die Erfahrung und der Rat anderer deuten darauf hin, dass Sie CTEs verwenden sollten, wenn Sie eine geringe Anzahl von Zeilen zurückgegeben haben. Wenn Sie eine große Anzahl haben, würden Sie wahrscheinlich von der Möglichkeit profitieren, die temporäre Tabelle zu indizieren.