Возврат строки из предложения With - PullRequest
1 голос
/ 21 мая 2010

Я пытаюсь создать функцию, которая перезапускает значение.

В моей функции у меня есть этот скрипт:

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
    )

возврат такой:

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

Теперь я хочу вернуть row 3 потому что в строке есть 1 RightsMUT

Как я мог это сделать? Я пытался сделать это с 2 With, но oracle пока не поддерживает 2 с.

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

Мое решение:

  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 голосов
/ 21 мая 2010

Позвольте мне попытаться угадать - пожалуйста, проверьте, дает ли следующее то, что вам нужно:

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
...