Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
WITH-Klausel
Eine WITH Klausel ist eine optionale Klausel, die der SELECT Liste in einer Abfrage vorangestellt wird. Die WITH Klausel definiert einen oder mehrere common_table_expressions. Jeder allgemeine Tabellenausdruck (CTE) definiert eine temporäre Tabelle, die einer Viewdefinition ähnelt. Sie können in der FROM Klausel auf diese temporären Tabellen verweisen. Sie werden nur verwendet, während die Abfrage, zu der sie gehören, ausgeführt wird. Jede CTE WITH Klausel gibt einen Tabellennamen, eine optionale Liste von Spaltennamen und einen Abfrageausdruck an, der zu einer Tabelle ausgewertet wird (eine SELECT Anweisung).
WITHKlausel-Unterabfragen sind eine effiziente Methode zur Definition von Tabellen, die während der Ausführung einer einzelnen Abfrage verwendet werden können. In allen Fällen können dieselben Ergebnisse erzielt werden, wenn Unterabfragen im Hauptteil der SELECT Anweisung verwendet werden, aber WITH Klausel-Unterabfragen sind möglicherweise einfacher zu schreiben und zu lesen. Wenn möglich, werden WITH Klausel-Unterabfragen, auf die mehrfach verwiesen wird, als allgemeine Unterausdrücke optimiert. Das heißt, es kann möglich sein, eine WITH Unterabfrage einmal auszuwerten und ihre Ergebnisse wiederzuverwenden. (Beachten Sie, dass allgemeine Unterausdrücke nicht auf die in der Klausel definierten Unterausdrücke beschränkt sind.) WITH
Syntax
[ WITH common_table_expression [, common_table_expression , ...] ]
wobei common_table_expression nicht rekursiv sein kann. Dies ist die nicht-rekursive Form:
CTE_table_name AS ( query )
Parameter
- common_table_expression
-
Definiert eine temporäre Tabelle, auf die Sie in der FROM-Klausel verweisen können und die nur während der Ausführung der Abfrage verwendet wird, zu der sie gehört.
- CTE_Tabellenname
-
Ein eindeutiger Name für eine temporäre Tabelle, die die Ergebnisse einer WITH Klausel-Unterabfrage definiert. Sie können innerhalb einer einzelnen WITH Klausel keine doppelten Namen verwenden. Jede Unterabfrage muss einen Tabellennamen erhalten, der in der referenziert werden kann FROM-Klausel.
- query
-
Jede SELECT Abfrage, die AWS Clean Rooms unterstützt. Siehe SELECT.
Nutzungshinweise
Sie können eine WITH Klausel in der folgenden SQL Anweisung verwenden:
-
SELECT,WITH, UNION UNIONALL,INTERSECT, oderEXCEPT.
Wenn die FROM Klausel einer Abfrage, die eine WITH Klausel enthält, auf keine der durch die WITH Klausel definierten Tabellen verweist, wird die WITH Klausel ignoriert und die Abfrage wird wie gewohnt ausgeführt.
Auf eine durch eine WITH Klausel-Unterabfrage definierte Tabelle kann nur in dem Bereich der SELECT Abfrage verwiesen werden, in dem die WITH Klausel beginnt. Sie können beispielsweise in der Klausel einer Unterabfrage in der SELECT Liste, FROM Klausel oder WHERE HAVING Klausel auf eine solche Tabelle verweisen. Sie können eine WITH Klausel nicht in einer Unterabfrage verwenden und auf ihre Tabelle in der FROM Klausel der Hauptabfrage oder einer anderen Unterabfrage verweisen. Dieses Abfragemuster führt zu einer Fehlermeldung in der Form relation
table_name doesn't exist
der WITH Klauseltabelle.
Sie können innerhalb einer WITH Klausel-Unterabfrage keine weitere WITH Klausel angeben.
Sie können keine Vorwärtsverweise auf Tabellen herstellen, die durch WITH Klauselunterabfragen definiert sind. Die folgende Abfrage gibt beispielsweise aufgrund der Vorausreferenz auf die Tabelle W2 in der Definition der Tabelle W1 einen Fehler zurück:
with w1 as (select * from w2), w2 as (select * from w1) select * from sales; ERROR: relation "w2" does not exist
Beispiele
Das folgende Beispiel zeigt den einfachsten Fall einer Abfrage, die eine WITH Klausel enthält. Die WITH angegebene Abfrage VENUECOPY wählt alle Zeilen aus der VENUE Tabelle aus. Die Hauptabfrage wählt wiederum alle Zeilen ausVENUECOPY. Die VENUECOPY Tabelle existiert nur für die Dauer dieser Abfrage.
with venuecopy as (select * from venue) select * from venuecopy order by 1 limit 10;
venueid | venuename | venuecity | venuestate | venueseats ---------+----------------------------+-----------------+------------+------------ 1 | Toyota Park | Bridgeview | IL | 0 2 | Columbus Crew Stadium | Columbus | OH | 0 3 | RFK Stadium | Washington | DC | 0 4 | CommunityAmerica Ballpark | Kansas City | KS | 0 5 | Gillette Stadium | Foxborough | MA | 68756 6 | New York Giants Stadium | East Rutherford | NJ | 80242 7 | BMO Field | Toronto | ON | 0 8 | The Home Depot Center | Carson | CA | 0 9 | Dick's Sporting Goods Park | Commerce City | CO | 0 v 10 | Pizza Hut Park | Frisco | TX | 0 (10 rows)
Das folgende Beispiel zeigt eine WITH Klausel, die zwei Tabellen mit den Namen VENUE _ SALES und TOP _ erzeugtVENUES. Die zweite WITH Abfragetabelle wählt aus der ersten aus. Die WHERE Klausel des Hauptabfrageblocks wiederum enthält eine Unterabfrage, die die Tabelle TOP _ VENUES einschränkt.
with venue_sales as (select venuename, venuecity, sum(pricepaid) as venuename_sales from sales, venue, event where venue.venueid=event.venueid and event.eventid=sales.eventid group by venuename, venuecity), top_venues as (select venuename from venue_sales where venuename_sales > 800000) select venuename, venuecity, venuestate, sum(qtysold) as venue_qty, sum(pricepaid) as venue_sales from sales, venue, event where venue.venueid=event.venueid and event.eventid=sales.eventid and venuename in(select venuename from top_venues) group by venuename, venuecity, venuestate order by venuename;
venuename | venuecity | venuestate | venue_qty | venue_sales ------------------------+---------------+------------+-----------+------------- August Wilson Theatre | New York City | NY | 3187 | 1032156.00 Biltmore Theatre | New York City | NY | 2629 | 828981.00 Charles Playhouse | Boston | MA | 2502 | 857031.00 Ethel Barrymore Theatre | New York City | NY | 2828 | 891172.00 Eugene O'Neill Theatre | New York City | NY | 2488 | 828950.00 Greek Theatre | Los Angeles | CA | 2445 | 838918.00 Helen Hayes Theatre | New York City | NY | 2948 | 978765.00 Hilton Theatre | New York City | NY | 2999 | 885686.00 Imperial Theatre | New York City | NY | 2702 | 877993.00 Lunt-Fontanne Theatre | New York City | NY | 3326 | 1115182.00 Majestic Theatre | New York City | NY | 2549 | 894275.00 Nederlander Theatre | New York City | NY | 2934 | 936312.00 Pasadena Playhouse | Pasadena | CA | 2739 | 820435.00 Winter Garden Theatre | New York City | NY | 2838 | 939257.00 (14 rows)
Die folgenden zwei Beispiele veranschaulichen die Regeln für den Bereich von Tabellenverweisen, die auf WITH Klauselunterabfragen basieren. Die erste Abfrage wird ausgeführt. Die zweite Abfrage schlägt jedoch mit einem erwarteten Fehler fehl. Die erste Abfrage enthält eine WITH Klausel-Unterabfrage in der SELECT Liste der Hauptabfrage. Auf die durch die WITH Klausel (HOLIDAYS) definierte Tabelle wird in der FROM Klausel der Unterabfrage in der SELECT Liste verwiesen:
select caldate, sum(pricepaid) as daysales, (with holidays as (select * from date where holiday ='t') select sum(pricepaid) from sales join holidays on sales.dateid=holidays.dateid where caldate='2008-12-25') as dec25sales from sales join date on sales.dateid=date.dateid where caldate in('2008-12-25','2008-12-31') group by caldate order by caldate; caldate | daysales | dec25sales -----------+----------+------------ 2008-12-25 | 70402.00 | 70402.00 2008-12-31 | 12678.00 | 70402.00 (2 rows)
Die zweite Abfrage schlägt fehl, weil sie versucht, sowohl in der Hauptabfrage als auch in der SELECT Listenunterabfrage auf die HOLIDAYS Tabelle zu verweisen. Die Referenzen der Hauptabfrage liegen außerhalb des Bereichs.
select caldate, sum(pricepaid) as daysales, (with holidays as (select * from date where holiday ='t') select sum(pricepaid) from sales join holidays on sales.dateid=holidays.dateid where caldate='2008-12-25') as dec25sales from sales join holidays on sales.dateid=holidays.dateid where caldate in('2008-12-25','2008-12-31') group by caldate order by caldate; ERROR: relation "holidays" does not exist