Recherche…


Joindre des lignes de table avec des lignes générées dynamiquement à partir d'une cellule

CROSS APPLY vous permet de "joindre" des lignes à partir d'une table avec des lignes générées dynamiquement renvoyées par une fonction de valeur de table.

Imaginez que vous ayez une table Company avec une colonne contenant un tableau de produits (colonne ProductList) et une fonction qui analyse ces valeurs et renvoie un ensemble de produits. Vous pouvez sélectionner toutes les lignes d'une table Company, appliquer cette fonction sur une colonne ProductList et "joindre" les résultats générés à la ligne mère de la société:

SELECT *
FROM Companies c 
     CROSS APPLY dbo.GetProductList( c.ProductList ) p

Pour chaque ligne, la valeur de la cellule ProductList sera fournie à la fonction et la fonction retournera ces produits sous la forme d'un ensemble de lignes pouvant être jointes à la ligne parente.

Joindre des lignes de table avec un tableau JSON stocké dans la cellule

CROSS APPLY vous permet de "joindre" des lignes à partir d'une table avec une collection d'objets JSON stockés dans une colonne.

Imaginez que vous ayez une table Company avec une colonne contenant un tableau de produits (colonne ProductList) formaté en tant que tableau JSON. La fonction de valeur de la table OPENJSON peut analyser ces valeurs et renvoyer l'ensemble de produits. Vous pouvez sélectionner toutes les lignes d'une table Société, analyser les produits JSON avec OPENJSON et "joindre" les résultats générés avec la ligne mère de la société:

SELECT *
FROM Companies c 
     CROSS APPLY OPENJSON( c.ProductList )
                 WITH ( Id int, Title nvarchar(30), Price money)

Pour chaque ligne, la valeur de la cellule ProductList sera fournie à la fonction OPENJSON qui transformera les objets JSON en lignes avec le schéma défini dans la clause WITH.

Filtrer les lignes par valeurs de tableau

Si vous stockez une liste de balises dans une rangée en tant que valeurs séparées par un coma, la fonction STRING_SPLIT vous permet de transformer une liste de balises en une table de valeurs. CROSS APPLY vous permet de "joindre" les valeurs analysées par la fonction STRING_SPLIT avec une ligne parente.

Imaginez que vous ayez une table Product avec une colonne contenant un tableau de balises séparées par des virgules (par exemple, promo, sales, new). STRING_SPLIT et CROSS APPLY vous permettent de joindre des lignes de produits avec leurs balises pour filtrer les produits par balises:

SELECT *
FROM Products p 
     CROSS APPLY STRING_SPLIT( p.Tags, ',' ) tags
WHERE tags.value = 'promo'

Pour chaque ligne, la valeur de la cellule Tags sera fournie à la fonction STRING_SPLIT qui renverra les valeurs des balises. Vous pouvez ensuite filtrer les lignes en fonction de ces valeurs.

Remarque: la fonction STRING_SPLIT n'est pas disponible avant SQL Server 2016



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow