Snowflake Cross Apply
Einführung
Beim Einsatz von SQL für komplexe Abfragen kann es notwendig sein, Daten aus verschiedenen Tabellen auf fortgeschrittenere Weise zu kombinieren. Dies geht über den Einsatz von inneren und äußeren Joins hinaus. Der CROSS APPLY Operator in SQL Server ermöglicht es, eine Tabelle mit einer tabellenwertigen Funktion zu verbinden, was vielseitige Abfrageoptionen schafft. Wenn Sie jedoch die Snowflake-Cloud-Datenplattform verwenden, haben Sie vielleicht bemerkt, dass es kein analoges Snowflake CROSS APPLY gibt.
Dieser Artikel erklärt, wie CROSS APPLY funktioniert und wie es in Snowflake mit LATERAL JOIN verwendet werden kann. Wir werden auch die Unterschiede zwischen diesen beiden Methoden vergleichen. Wir werden auch die Unterschiede zwischen diesen beiden Ansätzen vergleichen.
Am Ende werden Sie ein solides Verständnis davon haben, wie man in Snowflake komplexe Joins durchführen kann, die analog zu SQL Servers CROSS APPLY sind. Lassen Sie uns eintauchen!
Was ist CROSS APPLY?
In SQL Server ist CROSS APPLY ein Operator, der es ermöglicht, eine Tabelle mit einer tabellenwertigen Funktion zu verbinden. Er wendet die Funktion auf jede Zeile der linken Tabelle an und erzeugt ein Ergebnisset, indem die Zeilen aus der linken Tabelle mit den entsprechenden Zeilen kombiniert werden, die von der Funktion zurückgegeben werden.
Hier ist ein einfaches Beispiel, um zu veranschaulichen, wie es funktioniert:
-- Verwendung von CROSS APPLY SELECT * FROM Person p CROSS APPLY ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip;
In diesem Beispiel wird die Unterabfrage für jede Zeile in der Person-Tabelle mithilfe des Operators ausgeführt. Sie gibt die übereinstimmenden Zeilen aus der Company-Tabelle zurück, bei denen die companyId übereinstimmt. Das Ergebnis ist ein Join zwischen Person und Company basierend auf der ‘companyId’ Beziehung.
Die gleichwertige Abfrage mit der Standard-Inner-Join-Syntax wäre:
-- Gleichwertige Abfrage mit INNER JOIN SELECT * FROM Person p INNER JOIN Company c ON p.companyid = c.companyId;
Beide Abfragen geben dasselbe Ergebnisset zurück, aber die CROSS APPLY Version ermöglicht komplexere Join-Bedingungen und kann besonders nützlich sein, wenn mit tabellenwertigen Funktionen gearbeitet wird.
Snowflake Cross Apply
Snowflake hat kein CROSS APPLY, aber es hat eine ähnliche Funktionalität mit dem Schlüsselwort LATERAL, wenn es mit einem Join verwendet wird. Im ANSI SQL-Standard ermöglicht ein Lateral Join die Verwendung von Spalten aus vorherigen Tabellen in der Join-Bedingung. Dies führt zum selben Ergebnis wie die Verwendung von CROSS APPLY.
Hier ist ein Beispiel, wie Sie in Snowflake einen Lateral Join verwenden können, um dasselbe Ergebnis wie im obigen Beispiel zu erzielen:
-- Verwendung von LATERAL JOIN in Snowflake SELECT * FROM Person p LEFT JOIN LATERAL ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip ON TRUE;
In diesem Beispiel wird das Schlüsselwort LATERAL verwendet, um anzuzeigen, dass die folgende Unterabfrage auf Spalten der vorhergehenden Person-Tabelle verweisen kann. Die ON TRUE-Bedingung verbindet die Lateral Subquery bedingungslos mit der Person-Tabelle.
Der Lateral Join verhält sich ähnlich wie CROSS APPLY, wobei die Unterabfrage für jede Zeile der linken Tabelle ausgeführt und die Ergebnisse kombiniert werden. Der Hauptunterschied besteht darin, dass CROSS APPLY einen Inner Join durchführt, während das Lateral Join-Beispiel oben einen Left Join verwendet. Sie können ein Inner Join-Verhalten erreichen, indem Sie einfach LEFT JOIN LATERAL durch INNER JOIN LATERAL ersetzen.
Ausführungspläne
Werfen wir einen genaueren Blick auf die Ausführungspläne für die Beispiele CROSS APPLY und Lateral Join, um zu verstehen, wie sie sich unterscheiden.
Für das CROSS APPLY-Beispiel in SQL Server:
- Das System scannt die Person-Tabelle, um alle Zeilen abzurufen.
- Für jede Zeile in der Person-Tabelle führt SQL Server die Unterabfrage aus, die dem CROSS APPLY folgt. Es filtert die Company-Tabelle basierend auf der companyId-Bedingung.
- Die Abfrage verbindet die resultierenden Zeilen aus der Unterabfrage mit der entsprechenden Zeile aus Person.
- Die Funktion gibt das endgültige Ergebnisset zurück.
Für das LATERAL JOIN Beispiel in Snowflake:
- Das System scannt die Person-Tabelle, um alle Zeilen abzurufen.
- Die Lateral Subquery wird für jede Zeile in Person ausgeführt und filtert die Company-Tabelle basierend auf der companyId-Bedingung.
- Die resultierenden Zeilen aus der Lateral Subquery werden mit der entsprechenden Zeile aus Person unter Verwendung der ON TRUE-Bedingung verbunden.
- Die Funktion gibt das endgültige Ergebnisset zurück.
Die Ausführungspläne für beide Ansätze sind ähnlich, wobei der Hauptunterschied der verwendete Jointyp ist (Inner Join für CROSS APPLY und Left Join für das Lateral Join-Beispiel).
Beispiel mit vorläufiger Einrichtung
Werfen wir einen Blick auf ein umfassenderes Beispiel, das einige vorläufige Einrichtungsschritte umfasst. Angenommen, wir haben zwei Tabellen: Orders und OrderItems. Jede Bestellung kann mehrere Bestellposten haben und wir möchten den Gesamtbetrag für jede Bestellung zusammen mit den Bestelldetails abrufen.
Lassen Sie uns zunächst die notwendigen Tabellen erstellen:
-- Orders Tabelle erstellen CREATE TABLE Orders ( OrderID INT, CustomerID INT, OrderDate DATE ); -- OrderItems Tabelle erstellen CREATE TABLE OrderItems ( OrderID INT, ItemID INT, Quantity INT, Price DECIMAL(10, 2) );
-- Beispiel-Daten in die Orders-Tabelle einfügen INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES (1, 101, '2023-05-01'), (2, 102, '2023-05-02'), (3, 101, '2023-05-03'); -- Beispiel-Daten in die OrderItems-Tabelle einfügen INSERT INTO OrderItems (OrderID, ItemID, Quantity, Price) VALUES (1, 1, 2, 10.00), (1, 2, 1, 15.00), (2, 1, 3, 10.00), (2, 3, 2, 20.00), (3, 2, 1, 15.00);
Nun verwenden wir einen Lateral Join, um die Bestelldetails zusammen mit dem Gesamtbetrag für jede Bestellung abzurufen:
SELECT o.OrderID, o.CustomerID, o.OrderDate, oi.TotalAmount FROM Orders o LEFT JOIN LATERAL ( SELECT OrderID, SUM(Quantity * Price) AS TotalAmount FROM OrderItems WHERE OrderID = o.OrderID GROUP BY OrderID ) oi ON TRUE;
In diesem Beispiel wird für jede Zeile in der Orders-Tabelle die Lateral Subquery ausgeführt, um den Gesamtbetrag der Bestellung zu berechnen, indem das Produkt von Quantity und Price für die entsprechenden Bestellposten summiert wird. Das Ergebnis wird dann mithilfe der ON TRUE-Bedingung mit der Orders-Tabelle verbunden.
Die Ausgabe dieser Abfrage wird sein:
OrderID | CustomerID | OrderDate | TotalAmount --------+------------+------------+------------ 1 | 101 | 2023-05-01 | 35.00 2 | 102 | 2023-05-02 | 70.00 3 | 101 | 2023-05-03 | 15.00
Zusammenfassung und Fazit
In diesem Artikel haben wir uns angesehen, wie CROSS APPLY in SQL Server funktioniert und wie das Äquivalent in Snowflake mit Lateral Joins erreicht werden kann. Wir haben festgestellt, dass Snowflake kein CROSS APPLY hat, aber Lateral Joins ähnlich funktionieren. Sie ermöglichen es, dass Unterabfragen in der Join-Bedingung Spalten aus vorhergehenden Tabellen verwenden.
Wir haben uns Beispiele angesehen, wie man CROSS APPLY in SQL Server verwendet und wie man dasselbe Ergebnis mit einem Lateral Join in Snowflake erreicht. Wir haben die Pläne für beide Methoden besprochen und ein ausführliches Beispiel mit ersten Einrichtungsschritten gegeben.
Zu wissen, wie man Lateral Joins in Snowflake verwendet, ist wichtig, um effiziente Abfragen mit mehreren Tabellen und Unterabfragen zu schreiben.
Über DataSunrise
DataSunrise bietet benutzerfreundliche und flexible Tools für die Sicherheit, das Audit und die Compliance von Snowflake-Datenbanken. Unsere Lösungen helfen Organisationen, sensible Daten zu schützen, Datenbankaktivitäten zu überwachen und die Einhaltung von Vorschriften wie GDPR, HIPAA und PCI DSS sicherzustellen.
Wenn Sie mehr darüber erfahren möchten, was DataSunrise zu bieten hat, laden wir Sie ein, eine Online-Demo anzufordern. Unser Expertenteam wird Ihnen gerne unsere Produkte vorführen und besprechen, wie sie Ihnen effektiv bei der Sicherung und Verwaltung Ihrer Datenbanken helfen können.