[ora]Внешнее объединение
От: Funny Rabbit Россия  
Дата: 17.03.20 05:23
Оценка:
В таблице V_PSPAYCARD есть запись

year month rn summ
---------------------------------
2015 10 221599 131,02

В таблице PSPAYCARDRMND есть данные

rn year month summ
-----------------------------

221599 2015 11 131,02
221599 2015 12 131,02
221599 2016 1
131,02
221599 2016 2
1651,02
221599 2016 3
3171,02
221599 2016 4
1829,12
221599 2016 5
776,74
221599 2016 6
1976,74
221599 2016 7
1990,07
221599 2016 8
1737,69
221599 2016 9
2861,17
221599 2016 10 4173,90
221599 2016 11 1821,52
221599 2016 12 2762,47
221599 2017 1
4282,47
221599 2017 2
3002,47
221599 2017 3
2438,03

select distinct vp.*
  from PSPAYCARDRMND SP1,
       (select distinct mnd.YEAR,
                        mnd.MONTH,
                        mnd.RN as RN,
                        mnd.SUMM as SUMM,
                        mnd.prn 
          from PSPAYCARDRMND mnd
        union all
        select distinct extract(year from v.ddate_from) as year,
                        extract(month from v.ddate_from) as month,
                        v.nrn as RN,
                        v.ndebt_in as SUMM,
                        null
          from V_PSPAYCARD v) vp
        where SP1.PRN(+) = 221599
          and vp.rn = sp1.prn          
          and sp1.year(+) = vp.year
          and sp1.month(+) = vp.month          
order by vp.year, vp.month


Мне надо чтобы при объединении данные из таблицы V_PSPAYCARD попали в результат выборки. Особенно дата.
То что меня не убивает, делает меня умнее.
Отредактировано 17.03.2020 5:25 Funny Rabbit . Предыдущая версия . Еще …
Отредактировано 17.03.2020 5:24 Funny Rabbit . Предыдущая версия .
Re: [ora]Внешнее объединение
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.03.20 06:52
Оценка: 4 (1)
Здравствуйте, Funny Rabbit, Вы писали:

FR>В таблице V_PSPAYCARD есть запись


FR>year month rn summ

FR>---------------------------------
FR>2015 10 221599 131,02

FR>В таблице PSPAYCARDRMND есть данные


FR>rn year month summ

FR>-----------------------------

FR>221599 2015 11 131,02

FR>221599 2015 12 131,02
FR>221599 2016 1 131,02
FR>221599 2016 2 1651,02
FR>221599 2016 3 3171,02
FR>221599 2016 4 1829,12
FR>221599 2016 5 776,74
FR>221599 2016 6 1976,74
FR>221599 2016 7 1990,07
FR>221599 2016 8 1737,69
FR>221599 2016 9 2861,17
FR>221599 2016 10 4173,90
FR>221599 2016 11 1821,52
FR>221599 2016 12 2762,47
FR>221599 2017 1 4282,47
FR>221599 2017 2 3002,47
FR>221599 2017 3 2438,03

FR>
FR>select distinct vp.*
FR>  from PSPAYCARDRMND SP1,
FR>       (select distinct mnd.YEAR,
FR>                        mnd.MONTH,
FR>                        mnd.RN as RN,
FR>                        mnd.SUMM as SUMM,
FR>                        mnd.prn 
FR>          from PSPAYCARDRMND mnd
FR>        union all
FR>        select distinct extract(year from v.ddate_from) as year,
FR>                        extract(month from v.ddate_from) as month,
FR>                        v.nrn as RN,
FR>                        v.ndebt_in as SUMM,
FR>                        null
FR>          from V_PSPAYCARD v) vp
FR>        where SP1.PRN(+) = 221599
FR>          and vp.rn = sp1.prn          
FR>          and sp1.year(+) = vp.year
FR>          and sp1.month(+) = vp.month          
FR>order by vp.year, vp.month
FR>


FR>Мне надо чтобы при объединении данные из таблицы V_PSPAYCARD попали в результат выборки. Особенно дата.

Не очень понятно, чего вы хотите. UNION ALL — это склейка из двух таблиц. Считайте, что одну добавили "в хвост" к другой.
Join — это поиск совпадений в двух таблицах. Считайте, что они у вас располагаются рядом друг с другом.
У вас применяется какая-то хитрая комбинация и того и другого. Не очень понятно, зачем вы хотите делать join таблицы с самой собой.
На первый взгляд, вам нужно вот это:
select vp.*
  from (select distinct mnd.YEAR,
                        mnd.MONTH,
                        mnd.RN as RN,
                        mnd.SUMM as SUMM,
                        mnd.prn 
        from PSPAYCARDRMND mnd where mnd.prn = 221599
        union all
        select extract(year from v.ddate_from) as year,
               extract(month from v.ddate_from) as month,
               v.nrn as RN,
               v.ndebt_in as SUMM,
               null as prn
        from V_PSPAYCARD v) vp
order by vp.year, vp.month
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: [ora]Внешнее объединение
От: Funny Rabbit Россия  
Дата: 17.03.20 07:10
Оценка:
Здравствуйте, Sinclair, Вы писали:


Спасибо. Весь запрос выглядит так.

select sp1.* /*Утрировано*/
from (select distinct m, y
          from (select d_month(add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
                                          level - 1)) m,
                       d_year(add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
                                         level - 1)) y
                  from dual
                connect by level <=
                           (d_year(TO_DATE('31.07.2019', 'dd.mm.yyyy')) * 12 +
                           d_month(TO_DATE('31.07.2019', 'dd.mm.yyyy'))) -
                           (d_year(TO_DATE('01.01.2014', 'dd.mm.yyyy')) * 12 +
                           d_month(TO_DATE('01.01.2014', 'dd.mm.yyyy'))) + 1
                 order by add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
                                     level - 1))) period,
       (select distinct mnd.YEAR,
                        mnd.MONTH,
                        mnd.RN as RN,
                        mnd.SUMM as SUMM,
                        mnd.prn 
        from PSPAYCARDRMND mnd where mnd.prn = 221599
        union all
        select extract(year from v.ddate_from) as year,
               extract(month from v.ddate_from) as month,
               v.nrn as RN,
               v.ndebt_in as SUMM,
               null as prn
        from V_PSPAYCARD v
        where v.nrn = 221599) SP1,
       PSPAYCARDCHRG SP2,
       PSPAYCARDPMNT SP3
 where SP1.YEAR(+) = period.y
   and SP1.MONTH(+) = period.m
   and SP1.PRN(+) = 221599
   and SP2.YEAR(+) = period.y
   and SP2.MONTH(+) = period.m
   and SP2.PRN(+) = 221599
   and SP3.YEAR(+) = period.y
   and SP3.MONTH(+) = period.m
   and SP3.PRN(+) = 221599
   and not (SP1.RN is null and SP2.RN is null and SP3.RN is null)
 order by SP1.YEAR,
          SP1.MONTH,
          SP2.MONTH,
          SP2.YEAR,
          SP3.MONTH,
          SP3.YEAR,
          SP3.PAYDATE
То что меня не убивает, делает меня умнее.
Re[3]: [ora]Внешнее объединение
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.03.20 10:34
Оценка: 4 (1) +1
Здравствуйте, Funny Rabbit, Вы писали:

FR>Здравствуйте, Sinclair, Вы писали:



FR>Спасибо. Весь запрос выглядит так.


FR>
FR>select sp1.* /*Утрировано*/
FR>from (select distinct m, y
FR>          from (select d_month(add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
FR>                                          level - 1)) m,
FR>                       d_year(add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
FR>                                         level - 1)) y
FR>                  from dual
FR>                connect by level <=
FR>                           (d_year(TO_DATE('31.07.2019', 'dd.mm.yyyy')) * 12 +
FR>                           d_month(TO_DATE('31.07.2019', 'dd.mm.yyyy'))) -
FR>                           (d_year(TO_DATE('01.01.2014', 'dd.mm.yyyy')) * 12 +
FR>                           d_month(TO_DATE('01.01.2014', 'dd.mm.yyyy'))) + 1
FR>                 order by add_months(TO_DATE('01.01.2014', 'dd.mm.yyyy'),
FR>                                     level - 1))) period,
FR>       (select distinct mnd.YEAR,
FR>                        mnd.MONTH,
FR>                        mnd.RN as RN,
FR>                        mnd.SUMM as SUMM,
FR>                        mnd.prn 
FR>        from PSPAYCARDRMND mnd where mnd.prn = 221599
FR>        union all
FR>        select extract(year from v.ddate_from) as year,
FR>               extract(month from v.ddate_from) as month,
FR>               v.nrn as RN,
FR>               v.ndebt_in as SUMM,
FR>               null as prn
FR>        from V_PSPAYCARD v
FR>        where v.nrn = 221599) SP1,
FR>       PSPAYCARDCHRG SP2,
FR>       PSPAYCARDPMNT SP3
FR> where SP1.YEAR(+) = period.y
FR>   and SP1.MONTH(+) = period.m
FR>   and SP1.PRN(+) = 221599
FR>   and SP2.YEAR(+) = period.y
FR>   and SP2.MONTH(+) = period.m
FR>   and SP2.PRN(+) = 221599
FR>   and SP3.YEAR(+) = period.y
FR>   and SP3.MONTH(+) = period.m
FR>   and SP3.PRN(+) = 221599
FR>   and not (SP1.RN is null and SP2.RN is null and SP3.RN is null)
FR> order by SP1.YEAR,
FR>          SP1.MONTH,
FR>          SP2.MONTH,
FR>          SP2.YEAR,
FR>          SP3.MONTH,
FR>          SP3.YEAR,
FR>          SP3.PAYDATE
FR>

Ужас какой. Ну, он теперь работает правильно? Вообще, лучше все вот эти (+)= заменить на нормальные outer join. Distinct тоже нежелательно употреблять там, где он не нужен — страдает производительность.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: [ora]Внешнее объединение
От: Funny Rabbit Россия  
Дата: 17.03.20 10:54
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ужас какой. Ну, он теперь работает правильно? Вообще, лучше все вот эти (+)= заменить на нормальные outer join. Distinct тоже нежелательно употреблять там, где он не нужен — страдает производительность.


Это не мой код. Приходится сопровождать... Переписывать время нет.
То что меня не убивает, делает меня умнее.
Отредактировано 17.03.2020 10:54 Funny Rabbit . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.