我有一张外汇汇率表,其中有一些数据丢失。我有一个from_ccy_code,to_ccy_code,fx_date和fx_rate列。我想要做的是from_ccy_code = USD和to_ccy_code = EUR,如果该日期没有记录,则插入一条记录(fx_rate设置为1)。 在这种情况下,除了要插入fx_rate的日期之外,所有其他值都是静态的。如果值不存在,我可以编写SQL来插入特定日期,但我需要在插入中将日期设置为动态。请问有人可以帮忙解决这个问题吗?
以下是我到目前为止的情况。我知道这可能不是正确的语法,但一旦正确,这应该适用于设定日期。我不知道如何在这样的场景中使日期变得动态。
insert into fx_rates (from_ccy_code, to_ccy_code, fx_date, fx_rate)
select 'USD', 'EUR'
from dual
where not exists(select *
from fx_rates
where (from_ccy_code ='USD' and to_ccy_code ='EUR' and fx_date = '01-OCT-14'));
非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用connect by
子句生成范围的所有日期;例如,查看从10月1日到昨天的所有日子:
select date '2014-10-01' + level - 1
from dual
connect by level <= trunc(sysdate) - date '2014-10-01';
DATE'2014-10-01'+LEVEL-1
------------------------
01-OCT-14
02-OCT-14
...
26-OCT-14
27-OCT-14
27 rows selected
您当然可以使用自己的日期范围,我只是使用固定值来演示 - 您可能真的想要开始日期和结束日期的绑定值,或者从当月开始 - 使用trunc(sysdate, 'MM')
代替固定的开始日期。取决于我猜想如何以及何时运行。
您可以将固定值添加到同一查询中,将其用作公用表表达式(或内联视图),并使用类似的not exists
构造来检查您需要插入的值: / p>
with t (from_ccy_code, to_ccy_code, fx_date, fx_rate) as (
select 'USD', 'EUR', date '2014-10-01' + level - 1, 1
from dual
connect by level <= trunc(sysdate) - date '2014-10-01'
)
select * from t
where not exists(
select *
from fx_rates fr
where fr.from_ccy_code = t.from_ccy_code
and fr.to_ccy_code = t.to_ccy_code
and fr.fx_date = t.fx_date
);
你可以在insert
上加上merge
,但要使其适应merge into fx_rates fr
using (
select 'USD' as from_ccy_code, 'EUR' as to_ccy_code,
date '2014-10-01' + level - 1 as fx_date, 1 as fx_rate
from dual
connect by level <= trunc(sysdate) - date '2014-10-01'
) t
on (
t.from_ccy_code = fr.from_ccy_code
and t.to_ccy_code = fr.to_ccy_code
and t.fx_date = fr.fx_date
)
when not matched then
insert (from_ccy_code, to_ccy_code, fx_date, fx_rate)
values (t.from_ccy_code, t.to_ccy_code, t.fx_date, t.fx_rate);
声明可能更清晰:
{{1}}