>    наверное для точности - having, но всё-авно пока не придумал как :(

    Всё равно не совсем понятно, но попробуй так :

а) введи вычислимое поле 'уровень дерева' (lvl)
    как это сделать - много раз обсуждалось

б) добавь

    having sum(case lvl when 0 then quantity else 0 end)
          <> sum(case lvl when 2 then quantity else 0 end)


    Оно ?

    Кстати - select from select тут не нужен, проще написать

    for
        with recursive
            Recursion as (
              select m0.type_id ti, d0.id ci, d0.quantity q, 0 lvl
                from vw_det0 d0 join vw_DOC0 m0
                   on m0.id = d0.doc_id
                  and d0.card_id = -1
                  and d0.tovar_id = :tov_id

              UNION ALL

              select m1.type_id ti, d1.id ci, d1.quantity q, r.lvl + 1
                from vw_det0 d1 join vw_DOC0 m1
                   on m1.id = d1.doc_id
                       join Recursion r
                   on r.ci = d1.card_id
            ) ,

            Sums as (
                select ti, sum(q) as tmp
                    from Recursion
                group by ti
               having sum(case lvl when 0 then q else 0 end)
                     <> sum(case lvl when 2 then q else 0 end)
            )

    select ti, tmp from Sums
       into :ti, :tmp do

--
Хорсун Влад


Ответить