Ich habe angefangen, über Common Table Expression zu lesen, und kann mir keinen Anwendungsfall vorstellen, in dem ich sie verwenden müsste. Sie scheinen redundant zu sein, da dies auch mit abgeleiteten Tabellen möglich ist. Fehlt mir etwas oder verstehe ich es nicht gut? Kann mir jemand ein einfaches Beispiel für Einschränkungen bei regelmäßigen Auswahl-, abgeleiteten oder temporären Tabellenabfragen geben, um den Fall von CTE zu erläutern? Alle einfachen Beispiele wäre sehr dankbar.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Ich verwende sie, um komplexe Abfragen aufzuteilen, insbesondere komplexe Verknüpfungen und Unterabfragen. Ich stelle fest, dass ich sie immer häufiger als "Pseudo-Ansichten" verwende, um mich mit der Absicht der Abfrage vertraut zu machen.
Meine einzige Beschwerde über sie ist, dass sie nicht wiederverwendet werden können. Zum Beispiel kann ich einen gespeicherten Prozess mit zwei Aktualisierungsanweisungen haben, die denselben CTE verwenden könnten. Der 'Umfang' des CTE ist jedoch nur die erste Abfrage.
Das Problem ist, dass "einfache Beispiele" wahrscheinlich keine CTEs benötigen!
Trotzdem sehr praktisch.
quelle
VIEW
:) angesehen werdenEs gibt zwei Gründe, warum ich cte's benutze.
So verwenden Sie einen berechneten Wert in der where-Klausel Dies scheint mir ein wenig sauberer als eine abgeleitete Tabelle.
Angenommen, es gibt zwei Tabellen - Fragen und Antworten, die durch Questions.ID = Answers.Question_Id (und Quiz-ID) miteinander verbunden sind.
Hier ist ein weiteres Beispiel, in dem ich eine Liste mit Fragen und Antworten erhalten möchte. Ich möchte, dass die Antworten mit den Fragen in den Ergebnissen gruppiert werden.
quelle
HAVING
ist eine andere Möglichkeit, einen Filter im Spätstadium zu erstellen, der der Verwendung einesSELECT
Eines der Szenarien, die ich für die Verwendung von CTE nützlich fand, ist, wenn Sie DISTINCT-Datenzeilen basierend auf einer oder mehreren Spalten abrufen möchten, aber alle Spalten in der Tabelle zurückgeben möchten. Bei einer Standardabfrage müssen Sie möglicherweise zuerst die unterschiedlichen Werte in eine temporäre Tabelle kopieren und dann versuchen, sie wieder mit der ursprünglichen Tabelle zu verknüpfen, um den Rest der Spalten abzurufen, oder Sie schreiben eine äußerst komplexe Partitionsabfrage, in der die Ergebnisse zurückgegeben werden können Ein Lauf, aber höchstwahrscheinlich ist er nicht lesbar und führt zu Leistungsproblemen.
Aber mit CTE (wie von Tim Schmelter unter Wählen Sie die erste Instanz eines Datensatzes aus )
Wie Sie sehen können, ist dies viel einfacher zu lesen und zu warten. Und im Vergleich zu anderen Abfragen ist die Leistung viel besser.
quelle
Vielleicht ist es sinnvoller, sich einen CTE als Ersatz für eine Ansicht vorzustellen, die für eine einzelne Abfrage verwendet wird. Erfordert jedoch nicht den Overhead, die Metadaten oder die Persistenz einer formalen Ansicht. Sehr nützlich, wenn Sie:
Hier ist ein Beispiel zum Ausschneiden und Einfügen zum Spielen:
Genießen
quelle
Heute lernen wir den allgemeinen Tabellenausdruck kennen, eine neue Funktion, die in SQL Server 2005 eingeführt wurde und auch in späteren Versionen verfügbar ist.
Allgemeiner Tabellenausdruck: - Allgemeiner Tabellenausdruck kann als temporäre Ergebnismenge definiert werden oder mit anderen Worten als Ersatz für Ansichten in SQL Server. Der allgemeine Tabellenausdruck ist nur in dem Anweisungsstapel gültig, in dem er definiert wurde, und kann nicht in anderen Sitzungen verwendet werden.
Syntax zum Deklarieren von CTE (Common Table Expression): -
Nehmen wir ein Beispiel: -
Ich habe zwei Tabellen Mitarbeiter und Abteilung erstellt und 5 Zeilen in jede Tabelle eingefügt. Jetzt möchte ich diese Tabellen verbinden und eine temporäre Ergebnismenge erstellen, um sie weiter zu verwenden.
Nehmen wir jede Zeile der Aussage einzeln und verstehen.
Um CTE zu definieren, schreiben wir die Klausel "with", dann geben wir dem Tabellenausdruck einen Namen, hier habe ich den Namen "CTE_Example" angegeben.
Dann schreiben wir "As" und schließen unseren Code in zwei Klammern (---) ein. Wir können mehrere Tabellen in den eingeschlossenen Klammern verbinden.
In der letzten Zeile habe ich "Select * from CTE_Example" verwendet. Wir verweisen auf den Common-Tabellenausdruck in der letzten Codezeile. Wir können also sagen, dass es sich um eine Ansicht handelt, in der wir die Ansicht in einer einzigen definieren und verwenden Batch und CTE werden nicht als permanentes Objekt in der Datenbank gespeichert. Aber es verhält sich wie eine Ansicht. Wir können Lösch- und Aktualisierungsanweisungen für CTE ausführen. Dies hat direkte Auswirkungen auf die referenzierte Tabelle, die in CTE verwendet wird. Nehmen wir ein Beispiel, um diese Tatsache zu verstehen.
In der obigen Anweisung löschen wir eine Zeile aus CTE_Example und sie löscht die Daten aus der referenzierten Tabelle "DEPT", die im CTE verwendet wird.
quelle
Dies ist sehr nützlich, wenn Sie ein "bestelltes Update" durchführen möchten.
In MS SQL können Sie ORDER BY nicht mit UPDATE verwenden, aber mit Hilfe von CTE können Sie dies folgendermaßen tun:
Weitere Informationen finden Sie hier: So aktualisieren und bestellen Sie mithilfe von ms sql
quelle
Ein Punkt, auf den noch nicht hingewiesen wurde, ist die Geschwindigkeit . Ich weiß, dass es eine alte beantwortete Frage ist, aber ich denke, dass dies einen direkten Kommentar / eine direkte Antwort verdient:
Als ich CTE zum ersten Mal benutzte, war ich absolut verblüfft über seine Geschwindigkeit. Es war ein Fall wie aus einem Lehrbuch, der sehr gut für CTE geeignet war, aber in allen Fällen , in denen ich jemals CTE verwendet habe, gab es einen signifikanten Geschwindigkeitsgewinn. Meine erste Abfrage war komplex mit abgeleiteten Tabellen und dauerte lange Minuten. Mit CTE hat es Sekundenbruchteile gedauert und mich schockiert, dass es überhaupt möglich ist.
quelle
Versuche dies
quelle