2010-05-21 3 views
1

J'essaie de créer une fonction qui retrace une valeur.Renvoyer une ligne à partir d'une clause With

Dans ma fonction, j'ai ce script:

WITH t_new AS 
    (
     SELECT PersIDOLD, PersIDNEW, RightsMUT, 
     SUM(gap) over(ORDER BY PersIDOLD, PersIDNEW) grp 

     FROM 
     (
      SELECT h1.*, 
      CASE 
       WHEN h1.PersIDNEW = lag(h1.PersIDNEW) 
            over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
       OR h1.PersIDOLD = lag(h1.PersIDOLD) 
            over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
       THEN 0 
       ELSE 1 
      END gap 
      FROM HelpTable1 h1 

     ) 
    ) 
    SELECT PERSIDNEW, RIGHTSMUT 
    FROM t_new 
    WHERE grp = 
    (
     SELECT grp FROM t_new WHERE PersIDNEW = 12 -- going to be a variable 
    ) 

le retour est comme ceci:

http://img59.imageshack.us/img59/6733/tablei.gif

Maintenant, je veux revenir row 3 Coze il a une 1 dans la ligne RightsMUT

Comment est-ce que je pourrais faire ceci? J'ai essayé de le faire avec 2 With mais oracle ne supporte pas encore 2.

Répondre

0

Ma solution:

WITH t_new AS 
    (
     -- Alles durch gehen und 
     SELECT PersIDOLD, PersIDNEW, RightsMUT, SUM(gap) over(ORDER BY PersIDOLD, PersIDNEW) grp 
     FROM 
     (
      SELECT h1.*, 
      CASE 
       WHEN h1.PersIDNEW = lag(h1.PersIDNEW) over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
       OR h1.PersIDOLD = lag(h1.PersIDOLD) over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
       THEN 0 
       ELSE 1 
      END gap 
      FROM LUTAXKT.HILFSTABELLE1UMSETZUNG h1 
      --WHERE h1.updateflag = 0 
     ) 
    ) 
    SELECT PersIDNEW, RightsMUT 
    FROM t_new 
    WHERE RightsMUT = 1 and 
    grp = 
    (
     SELECT grp FROM t_new WHERE PersIDNEW = 12 
    ) 
0

Permettez-moi de deviner - pls vérifier si ce qui suit vous donne ce que vous avez besoin:

WITH t_new AS 
(
    SELECT PersIDOLD, PersIDNEW, RightsMUT, 
    SUM(gap) over(ORDER BY PersIDOLD, PersIDNEW) grp 

    FROM 
    (
     SELECT h1.*, 
     CASE 
      WHEN h1.PersIDNEW = lag(h1.PersIDNEW) 
           over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
      OR h1.PersIDOLD = lag(h1.PersIDOLD) 
           over(ORDER BY h1.PersIDOLD, h1.PersIDNEW) 
      THEN 0 
      ELSE 1 
     END gap 
     FROM HelpTable1 h1 

    ) 
) 
SELECT PERSIDNEW, RIGHTSMUT 
FROM t_new 
WHERE PersIDNEW = 12 AND RightsMUT = 1 
+0

cela ne fait rien revenir, mais je trouve un moyen comment faire ... et il était si simple:/ – domiSchenk

+0

ok, si vous l'avez résolu soit mettre à jour la question pour afficher la réponse (vous pourriez obtenir des commentaires à ce sujet) ou postez-le comme la réponse à votre propre question. – Unreason

Questions connexes