2014-07-10 2 views
2

J'ai écrit une requête dans SQL Server à l'aide d'une application CROSS et j'ai besoin de la traduire dans la syntaxe Oracle. J'ai cherché des équivalents Oracle mais je ne sais pas comment les appliquer.CROSS APPLY dans Oracle

Voici le SQL:

SELECT [f_lForiegnKey], [f_lAnalysisVariableKey], nYear, dBefore, dAfter, szBefore, szAfter 
    FROM [dbo].[A_STRATS_V] 
    CROSS APPLY (

      SELECT 1 as nYear,[dBefore0], [dAfter0],[szBefore0], [szAfter0] UNION ALL 
      SELECT 2 as nYear,[dBefore1], [dAfter1],[szBefore1], [szAfter1] UNION ALL 
      SELECT 3 as nYear,[dBefore2], [dAfter2],[szBefore2], [szAfter2] UNION ALL 
      SELECT 4 as nYear,[dBefore3], [dAfter3],[szBefore3], [szAfter3] UNION ALL 
      SELECT 5 as nYear,[dBefore4], [dAfter4],[szBefore4], [szAfter4] 
     ) d (nYear, dBefore, dAfter, szBefore, szAfter) 
    GO 

je lis quelque chose sur un latéral, mais rejoindre je ne sais pas comment l'appliquer.

Toute aide serait appréciée, même si c'est juste un exemple similaire.

Merci!

Répondre

1

Vous pouvez écrire cette requête dans les deux bases de données en utilisant simplement cross join avec les instructions case. La syntaxe est un peu différente en raison du besoin de dual dans Oracle:

SELECT s.f_lForiegnKey, s.f_lAnalysisVariableKey, n.nYear, 
     s.dBefore, s.dAfter, 
     (case when n.nYear = 1 then s.dBefore0 
      when n.nYear = 2 then s.dBefore1 
      when n.nYear = 3 then s.dBefore2 
      when n.nYear = 4 then s.dBefore3 
      when n.nYear = 5 then s.dBefore4 
     end) as s.dBefore, 
     (case when n.nYear = 1 then s.dAfter0 
      when n.nYear = 2 then s.dAfter1 
      when n.nYear = 3 then s.dAfter2 
      when n.nYear = 4 then s.dAfter3 
      when n.nYear = 5 then s.dAfter4 
     end) as s.dAfter, 
     (case when n.nYear = 1 then s.szBefore0 
      when n.nYear = 2 then s.szBefore1 
      when n.nYear = 3 then s.szBefore2 
      when n.nYear = 4 then s.szBefore3 
      when n.nYear = 5 then s.szBefore4 
     end) as s.szBefore, 
     (case when n.nYear = 1 then s.szAfter0 
      when n.nYear = 2 then s.szAfter1 
      when n.nYear = 3 then s.szAfter2 
      when n.nYear = 4 then s.szAfter3 
      when n.nYear = 5 then s.szAfter4 
     end) as s.szAfter 
FROM A_STRATS_V s cross join 
    (select 1 as nYear from dual union all 
     select 2 from dual union all 
     select 3 from dual union all 
     select 4 from dual union all 
     select 5 from dual union all 
    ) n;