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 попали в результат выборки. Особенно дата.
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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
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
Здравствуйте, 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 тоже нежелательно употреблять там, где он не нужен — страдает производительность.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Ужас какой. Ну, он теперь работает правильно? Вообще, лучше все вот эти (+)= заменить на нормальные outer join. Distinct тоже нежелательно употреблять там, где он не нужен — страдает производительность.
Это не мой код. Приходится сопровождать... Переписывать время нет.