samedi 29 mai 2010

SqlServer - Cross Apply

A quoi sert Cross Apply
Cross Apply est une nouvelle fonctionnalité T-SQL apparue avec SQL 205 (si je ne me trompe pas).
Cross Apply est une alternative permettant de contourner les limitations du cross join.

En effet, il n'est pas possible d'écrire la requête suivante car A.Val est hors du scope de la requête principale.
select A.*, b.X
from A
cross join (select B.X from B where B.Val=A.Val) b -- Invalid!

La seule façon d'arriver au résultat attendu est de rejeter le test "B.Val=A.Val" hors du scope du cross join.
Mais cela à une lourde conséquence car le travail de jointure est très couteux en ressource.
select A.*, b.X
from A
cross join (select * from B) b
where A.Val = b.Val -- Correct!

 C'est là qu'intervient le Cross Apply car l'instruction permet de faire le test de jointure dans le scope du Cross Apply.
select A.*, b.X
from A
cross apply (select B.X from B where B.Val=A.Val) b



Exemples
-- Cross Apply avec une sous requête
select o.*, rs.RunningSum, rs.SameCode
from Order o
cross apply
 (
   select
     sum(Amount) as RunningSum,
     sum(case when p.OrderCode = o.OrderCode then Amount else 0 end) as SameCode
   from Order P
   where P.OrderDate <= O.OrderDate
 ) rs

-- Cross Apply pour retrouver l'élément précédent
select o.*, prev.*
from Order o
cross apply
 (
   select top 1 *
   from Order P where P.OrderDate < O.OrderDate
   order by OrderDate DESC
 ) prev

Lectures
  •  "Taking a look at CROSS APPLY" est un excellent article avec plein de cas pratiques du Cross Apply. Les exemples sont d'ailleurs issus de cet article.
  • "Using CROSS APPLY" est un article de SqlTeam.
    Visiblement intéressant mais je n'ai pas poussé la lecture sur ce dernier. A noter qu'il utilise l'instruction ROW_NUMBER() sur les partitions SQL.

Aucun commentaire: