Die PostgreSQL-Dokumentation zu WITH zeigt das folgende Beispiel:
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
Es stellt auch fest:
Eine nützliche Eigenschaft von WITH-Abfragen besteht darin, dass sie nur einmal pro Ausführung der übergeordneten Abfrage ausgewertet werden, selbst wenn sie von der übergeordneten Abfrage oder den Geschwister-WITH-Abfragen mehrmals referenziert werden.
Ich sehe, dass WITHdies für andere Dinge verwendet werden kann, beispielsweise für die rekursive Auswertung. Gibt es im obigen Beispiel einen wichtigen Unterschied zwischen der Verwendung WITHund der Erstellung temporärer Tabellen?
TEMPORARY TABLEmit ON COMMIT DROPinnerhalb einer Abfrage verwenden, müssen Sie auch nur die Abfrage ändern und erneut ausführen , oder? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTinWITHwird nur den Namen eingeben und erneut ausführen. Während mit temporären Tabelle würde es dauernDROPundCREATE. Wenn Sie dagegen eine Abfrage erstellen und statische Daten häufig wiederverwenden, ist das Erstellen einer temporären Tabelle mit Indizes definitiv vorteilhaft für CTE.