Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Выборка на основе таблицы с шаблонными данными.  [new]
AVRomanenko
Member

Откуда:
Сообщений: 87
Здравствуйте!
Имеется 2 таблицы.

1 таблица - это актуальные данные по клиентам, в которых есть некоторые поля.
LOAN_CL EFF_DT DT_CH_PRC BASE_CCY_F SIMILAR_F
Депозитный договор 19.03.2008 01.01.1900 1 N
Кредитный договор 22.03.2006 01.01.1900 0 N
Кредитный договор 17.11.2019 01.01.1900 1 Y


2 таблица - это шаблоны, удовлетворяя которые в первой таблице должно быть проставлено дополнительное поле с флагом, который соответствует флагу 6го поля из 2й таблицы.
LOAN_CL EFF_DT DT_CH_PRC BASE_CCY_F SIMILAR_F RVSR
Кредитный договор >=2019-03-01 1 Y Y
Кредитный договор >=2019-03-01 1 Y Y
Кредитный договор <2019-03-01 <2019-03-01 1 Y N
Кредитный договор #Y N
Кредитный договор 0 N


на выходе должно получиться такое (измененнная первая таблица 1):
LOAN_CL EFF_DT DT_CH_PRC BASE_CCY_F SIMILAR_F RVSR_F
Депозитный договор 19.03.2008 01.01.1900 1 NN
Кредитный договор 22.03.2006 01.01.1900 0 NN
Кредитный договор 17.11.2019 01.01.1900 1 YY

поскольку в 3 строке таблицы 1 все поля удовлетворяют условиям из таблицы 2, которым соответствует поле RVSR = Y.

программно сделать эту связку пока не очень получается.
написал скрипт, он выводит большее количество строк, чем нужно...
select
case
when 
CR_SA.LOAN_CL = RVSR.LOAN_CL 
and (left(RVSR.EFF_DT,2) = '>='
or left(RVSR.DT_CH_PRC,2) = '>=' )
and CR_SA.BASE_CCY_F = RVSR.BASE_CCY_F
and right(RVSR.SIMILAR_F,1) = 'Y'
then 'Y' else 'N' end RVSR_F
from TABLE_1 CR_SA
left join TABLE_2 RVSR
on  CR_SA.LOAN_CL = RVSR.LOAN_CL
and  (CR_SA.EFF_DT =  cast(replace(replace(replace(RVSR.EFF_DT, '>',''), '<',''),'=','') as date) 
or CR_SA.DT_CH_PRC =  cast(replace(replace(replace(RVSR.DT_CH_PRC, '>',''), '<',''),'=','') as date) )
and CR_SA.BASE_CCY_F = RVSR.BASE_CCY_F
and CR_SA.SIMILAR_F  = RVSR.SIMILAR_F
27 июн 19, 10:59    [21916004]     Ответить | Цитировать Сообщить модератору
 Re: Выборка на основе таблицы с шаблонными данными.  [new]
A.Panskikh
Member

Откуда: Москва
Сообщений: 120
AVRomanenko,

для подобных случаев

Select t1.* , 1 from t1 where [not] exists (select 1 from t2 where ... )

и это более правильный для написания update.
28 июн 19, 09:14    [21916732]     Ответить | Цитировать Сообщить модератору
 Re: Выборка на основе таблицы с шаблонными данными.  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Добрый день.

По-моему удобнее завести для неравенств в датах поля *_from и *_to с включением границ, а не парсить знаки неравенств из полей:

2 таблица - это шаблоны...
LOAN_CL EFF_DT_from EFF_DT_to DT_CH_PRC_fromDT_CH_PRC_to BASE_CCY_F SIMILAR_F RVSR
Кредитный договор 2019-03-01 1 Y Y
Кредитный договор 2019-03-01 1 Y Y
Кредитный договор 2019-02-28 2019-02-28 1 Y N
Кредитный договор #Y N
Кредитный договор 0 N


Запрос тогда:

select a.*, coalesce(b.RVSR, 'N') as RVSR_F
from TABLE_1 a
left join table
(
select *
from TABLE_2 b 
where a.LOAN_CL = b.LOAN_CL 
and a.EFF_DT between coalesce(b.EFF_DT_from, a.EFF_DT) and coalesce(b.EFF_DT_to, a.EFF_DT)
and a.DT_CH_PRC between coalesce(b.DT_CH_PRC_from, a.DT_CH_PRC) and coalesce(b.DT_CH_PRC_to, a.DT_CH_PRC)
and a.BASE_CCY_F = coalesce(b.BASE_CCY_F, a.BASE_CCY_F)
and a.SIMILAR_F = coalesce(b.SIMILAR_F, a.SIMILAR_F)
fetch first 1 row only
) b on 1 = 1
;


Здесь из шаблонов берется первая попавшаяся запись, удовлетворяющая всем условиям (NULL в поле шаблонов, как я понял, считается отсутствием условий), иначе могут быть дубли.
Если нужны дубли или известно, что их не может быть, то можно закомментировать строку с "fetch first" (или переписать на "left join TABLE_b ON ..." с теми же условиями).
29 июн 19, 12:13    [21917447]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить