Snowflake Cross Apply
Introduction
Lors de l’utilisation de SQL pour des requêtes complexes, vous pouvez avoir besoin de combiner des données provenant de différentes tables de manière plus avancée. Cela va au-delà de l’utilisation des jointures internes et externes. L’opérateur CROSS APPLY dans SQL Server vous permet de joindre une table à une fonction qui renvoie des tables, créant ainsi des options de requêtes polyvalentes. Cependant, si vous utilisez la plate-forme de données cloud Snowflake, vous avez peut-être remarqué qu’il n’existe pas d’analogue au CROSS APPLY de Snowflake.
Cet article expliquera comment fonctionne CROSS APPLY et comment l’utiliser dans Snowflake avec LATERAL JOIN. Nous comparerons également les différences entre ces deux méthodes. Nous comparerons également les différences entre ces deux approches.
À la fin, vous aurez une compréhension solide de la façon d’effectuer des jointures complexes dans Snowflake qui sont analogues au CROSS APPLY de SQL Server. Allons-y!
Qu’est-ce que CROSS APPLY?
Dans SQL Server, CROSS APPLY est un opérateur qui vous permet de joindre une table à une fonction qui renvoie des tables. Il applique la fonction à chaque ligne de la table de gauche et produit un ensemble de résultats en combinant les lignes de la table de gauche avec les lignes correspondantes renvoyées par la fonction.
Voici un exemple simple pour illustrer comment cela fonctionne :
-- Utilisation de CROSS APPLY SELECT * FROM Person p CROSS APPLY ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip;
Dans cet exemple, la sous-requête est exécutée pour chaque ligne de la table Person en utilisant l’opérateur. Elle renvoie les lignes correspondantes de la table Company où companyId correspond. Le résultat est une jointure entre Person et Company basée sur la relation ‘companyId’.
La requête équivalente en utilisant la syntaxe INNER JOIN standard serait :
-- Requête équivalente en utilisant INNER JOIN SELECT * FROM Person p INNER JOIN Company c ON p.companyid = c.companyId;
Les deux requêtes renverront le même ensemble de résultats, mais la version CROSS APPLY permet des conditions de jointure plus complexes et peut être particulièrement utile lors du travail avec des fonctions qui renvoient des tables.
Snowflake Cross Apply
Snowflake n’a pas de CROSS APPLY, mais il a une fonctionnalité similaire avec le mot-clé LATERAL lorsqu’il est utilisé avec une jointure. Dans la norme ANSI SQL, une jointure latérale vous permet d’utiliser des colonnes des tables précédentes dans la condition de jointure. Cela donne le même résultat que l’utilisation de CROSS APPLY.
Voici un exemple de la façon dont vous pouvez utiliser une jointure latérale dans Snowflake pour obtenir le même résultat que l’exemple ci-dessus :
-- Utilisation de LATERAL JOIN dans Snowflake SELECT * FROM Person p LEFT JOIN LATERAL ( SELECT * FROM Company c WHERE p.companyid = c.companyId ) Czip ON TRUE;
Dans cet exemple, le mot-clé LATERAL est utilisé pour indiquer que la sous-requête suivante peut faire référence à des colonnes de la table Person précédente. La condition ON TRUE joint inconditionnellement la sous-requête latérale à la table Person.
La jointure latérale se comporte de manière similaire à CROSS APPLY, exécutant la sous-requête pour chaque ligne de la table de gauche et combinant les résultats. La principale différence est que CROSS APPLY effectue une jointure interne, tandis que l’exemple de jointure latérale ci-dessus utilise une jointure à gauche. Vous pouvez obtenir un comportement de jointure interne en changeant simplement LEFT JOIN LATERAL par INNER JOIN LATERAL.
Plans d’exécution
Examinons de plus près les plans d’exécution des exemples CROSS APPLY et de jointure latérale pour comprendre comment ils diffèrent.
Pour l’exemple CROSS APPLY dans SQL Server :
- Le système analyse la table Person pour récupérer toutes les lignes.
- Pour chaque ligne de la table Person, SQL Server exécute la sous-requête suivant CROSS APPLY. Il filtre la table Company en fonction de la condition companyId.
- La requête joint les lignes résultantes de la sous-requête avec la ligne correspondante de Person.
- La fonction renvoie l’ensemble de résultats final.
Pour l’exemple de jointure latérale dans Snowflake :
- Le système analyse la table Person pour récupérer toutes les lignes.
- La sous-requête latérale s’exécute pour chaque ligne de la table Person, filtrant la table Company en fonction de la condition companyId.
- Les lignes résultantes de la sous-requête latérale sont jointes à gauche avec la ligne correspondante de Person en utilisant la condition ON TRUE.
- La fonction renvoie l’ensemble de résultats final.
Les plans d’exécution des deux approches sont similaires, la principale différence étant le type de jointure utilisée (jointure interne pour CROSS APPLY et jointure à gauche pour l’exemple de jointure latérale).
Exemple avec préparation préliminaire
Examinons un exemple plus complet qui inclut certaines étapes de configuration préliminaires. Supposons que nous ayons deux tables : Orders et OrderItems. Chaque commande peut avoir plusieurs articles de commande, et nous voulons récupérer le montant total pour chaque commande avec les détails de la commande.
Tout d’abord, créons les tables nécessaires :
-- Créer la table Orders CREATE TABLE Orders ( OrderID INT, CustomerID INT, OrderDate DATE ); -- Créer la table OrderItems CREATE TABLE OrderItems ( OrderID INT, ItemID INT, Quantity INT, Price DECIMAL(10, 2) );
-- Insérer des données d'exemple dans la table Orders INSERT INTO Orders (OrderID, CustomerID, OrderDate) VALUES (1, 101, '2023-05-01'), (2, 102, '2023-05-02'), (3, 101, '2023-05-03'); -- Insérer des données d'exemple dans la table 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);
Maintenant, utilisons une jointure latérale pour récupérer les détails de la commande ainsi que le montant total pour chaque commande :
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;
Dans cet exemple, pour chaque ligne de la table Orders, la sous-requête latérale est exécutée pour calculer le montant total de la commande en faisant la somme du produit de Quantity et Price pour les articles de commande correspondants. Le résultat est ensuite joint à la table Orders en utilisant la condition ON TRUE.
Le résultat de cette requête sera :
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
Résumé et Conclusion
Dans cet article, nous avons examiné comment fonctionne CROSS APPLY dans SQL Server et son équivalent dans Snowflake en utilisant les jointures latérales. Nous avons découvert que Snowflake n’a pas de CROSS APPLY, mais les jointures latérales fonctionnent de manière similaire. Elles permettent aux sous-requêtes d’utiliser des colonnes des tables précédentes dans la condition de jointure.
Nous avons examiné des exemples de l’utilisation de CROSS APPLY dans SQL Server et de la manière d’obtenir le même résultat en utilisant une jointure latérale dans Snowflake. Nous avons parlé des plans pour les deux méthodes et avons donné un exemple détaillé avec des étapes de configuration préliminaires.
Savoir utiliser les jointures latérales dans Snowflake est important pour écrire des requêtes efficaces avec plusieurs tables et sous-requêtes.
À propos de DataSunrise
DataSunrise fournit des outils conviviaux et flexibles pour la sécurité des bases de données Snowflake, l’audit et la conformité. Nos solutions aident les organisations à protéger les données sensibles, à surveiller l’activité des bases de données et à garantir la conformité avec des règlements tels que le RGPD, HIPAA et PCI DSS.
Si vous êtes intéressé à en savoir plus sur ce que DataSunrise a à offrir, nous vous invitons à demander une démo en ligne. Notre équipe d’experts se fera un plaisir de présenter nos produits et de discuter de la manière dont ils peuvent vous aider à sécuriser et à gérer efficacement vos bases de données.