Snowflake Cross Apply
Introduzione
Quando si utilizza SQL per query complesse, potrebbe essere necessario combinare dati da diverse tabelle in modi più avanzati. Questo va oltre l’uso dei join interni ed esterni. L’operatore CROSS APPLY in SQL Server consente di effettuare join tra una tabella e una funzione a valori di tabella, creando opzioni di query versatili. Tuttavia, se si utilizza la piattaforma dati Cloud Snowflake, si potrebbe aver notato che non esiste un analogo Snowflake CROSS APPLY.
Questo articolo spiegherà come funziona CROSS APPLY e come utilizzarlo in Snowflake con LATERAL JOIN. Confronteremo anche le differenze tra questi due metodi. Andremo anche a confrontare le differenze tra questi due approcci.
Alla fine, avrà una solida comprensione di come eseguire join complessi in Snowflake analoghi a SQL Server’s CROSS APPLY. Iniziamo!
Che Cos’è CROSS APPLY?
In SQL Server, CROSS APPLY è un operatore che consente di effettuare join tra una tabella e una funzione a valori di tabella. Applica la funzione a ciascuna riga della tabella di sinistra e produce un set di risultati combinando le righe della tabella di sinistra con le righe corrispondenti restituite dalla funzione.
Ecco un semplice esempio per illustrare come funziona:
-- Uso di CROSS APPLY SELECT * FROM Person p CROSS APPLY ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip;
In questo esempio, la sottoquery viene eseguita per ogni riga nella tabella Person using l’operatore. Restituisce le righe corrispondenti dalla tabella Company dove companyId corrisponde. Il risultato è un join tra Person e Company basato sulla relazione ‘companyId’.
La query equivalente utilizzando la sintassi INNER JOIN standard sarebbe:
-- Query equivalente usando INNER JOIN SELECT * FROM Person p INNER JOIN Company c ON p.companyid = c.companyId;
Entrambe le query restituiranno lo stesso set di risultati, ma la versione CROSS APPLY consente condizioni di join più complesse e può essere particolarmente utile quando si lavora con funzioni a valori di tabella.
Snowflake Cross Apply
Snowflake non ha CROSS APPLY, ma ha una funzionalità simile con la parola chiave LATERAL quando viene utilizzata con un join. Nel linguaggio SQL standard ANSI, un join laterale consente di utilizzare colonne dalle tabelle precedenti nella condizione del join. Questo produce lo stesso risultato dell’uso di CROSS APPLY.
Ecco un esempio di come si può utilizzare un join laterale in Snowflake per ottenere lo stesso risultato dell’esempio sopra:
-- Usando LATERAL JOIN in Snowflake SELECT * FROM Person p LEFT JOIN LATERAL ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip ON TRUE;
In questo esempio, la parola chiave LATERAL viene utilizzata per indicare che la sottoquery seguente può fare riferimento a colonne dalla tabella Person precedente. La condizione ON TRUE unisce incondizionatamente la sottoquery laterale con la tabella Person.
Il join laterale si comporta in modo simile a CROSS APPLY, eseguendo la sottoquery per ogni riga della tabella di sinistra e combinando i risultati. La principale differenza è che CROSS APPLY effettua un join interno, mentre l’esempio di join laterale sopra utilizza un join sinistro. Si può ottenere un comportamento di join interno semplicemente cambiando LEFT JOIN LATERAL in INNER JOIN LATERAL.
Piani di Esecuzione
Esaminiamo più da vicino i piani di esecuzione per gli esempi CROSS APPLY e join laterale per capire come differiscono.
Per l’esempio CROSS APPLY in SQL Server:
- Il sistema scansiona la tabella Person per recuperare tutte le righe.
- Per ogni riga in Person, SQL Server esegue la sottoquery seguente il CROSS APPLY. Filtra la tabella Company basandosi sulla condizione companyId.
- La query unisce le righe risultanti dalla sottoquery con la riga corrispondente da Person.
- La funzione restituisce il set di risultati finale.
Per l’esempio LATERAL JOIN in Snowflake:
- Il sistema scansiona la tabella Person per recuperare tutte le righe.
- La sottoquery laterale esegue per ogni riga in Person, filtrando la tabella Company basandosi sulla condizione companyId.
- Le righe risultanti dalla sottoquery laterale sono unite in modo sinistro con la riga corrispondente da Person usando la condizione ON TRUE.
- La funzione restituisce il set di risultati finale.
I piani di esecuzione per entrambi gli approcci sono simili, con la principale differenza essendo il tipo di join utilizzato (join interno per CROSS APPLY e join sinistro per l’esempio join laterale).
Esempio con Configurazione Preliminare
Vediamo un esempio più completo che include alcuni passaggi preliminari di configurazione. Supponiamo di avere due tabelle: Orders e OrderItems. Ogni ordine può avere più articoli d’ordine, e vogliamo recuperare l’importo totale per ciascun ordine insieme ai dettagli dell’ordine.
Per prima cosa, creiamo le tabelle necessarie:
-- Creare la tabella Orders CREATE TABLE Orders ( OrderID INT, CustomerID INT, OrderDate DATE ); -- Creare la tabella OrderItems CREATE TABLE OrderItems ( OrderID INT, ItemID INT, Quantity INT, Price DECIMAL(10, 2) );
-- Inserire dati di esempio nella tabella Orders INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES (1, 101, '2023-05-01'), (2, 102, '2023-05-02'), (3, 101, '2023-05-03'); -- Inserire dati di esempio nella tabella OrderItems 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);
Ora, utilizziamo un join laterale per recuperare i dettagli dell’ordine insieme all’importo totale per ciascun ordine:
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 questo esempio, per ciascuna riga nella tabella Orders, la sottoquery laterale viene eseguita per calcolare l’importo totale dell’ordine sommando il prodotto di Quantity e Price per gli articoli d’ordine corrispondenti. Il risultato poi si unisce alla tabella Orders usando la condizione ON TRUE.
Il risultato di questa query sarà:
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
Sommario e Conclusione
In questo articolo, abbiamo esaminato come funziona CROSS APPLY in SQL Server e il suo equivalente in Snowflake utilizzando join laterali. Abbiamo scoperto che Snowflake non ha CROSS APPLY, ma i join laterali funzionano in modo simile. Consentono alle sottoquery di utilizzare colonne dalle tabelle precedenti nella condizione del join.
Abbiamo esaminato esempi di come utilizzare CROSS APPLY in SQL Server e come ottenere lo stesso risultato utilizzando un join laterale in Snowflake. Abbiamo discusso i piani per entrambi i metodi e fornito un esempio dettagliato con passaggi di configurazione iniziale.
Sapere come utilizzare i join laterali in Snowflake è importante per scrivere query efficienti con più tabelle e sottoquery.
Informazioni su DataSunrise
DataSunrise fornisce strumenti intuitivi e flessibili per la sicurezza del database Snowflake, l’audit, e conformità. Le nostre soluzioni aiutano le organizzazioni a proteggere i dati sensibili, monitorare l’attività del database e garantire la conformità con regolamenti come GDPR, HIPAA e PCI DSS.
Se è interessato a saperne di più su ciò che DataSunrise ha da offrire, La invitiamo a richiedere una demo online. Il nostro team di esperti sarà lieto di presentare i nostri prodotti e discutere come possono aiutare la sua organizzazione a proteggere e gestire efficacemente i database.