按最新日期加入2个表格

时间:2015-12-07 14:45:53

标签: sql oracle

2桌

从general_data

中选择*
 ID  | currecny | DATE_ACT
  1       USD    01/12/2015    
  2       USD    02/12/2015 
  3       GBP    01/12/2015
  4       GBP    03/12/2015 
  5       USD    06/12/2015  

从currency_data

中选择*
  currecny | RATE_DATE | Rate
    USD      04/12/2015   3.51
    USD      02/12/2015   3.46
    GBP      01/12/2015   4.62
    USD      01/12/2015   3.50

我想将ID与其有效货币相匹配。

货币与货币名称和'日期'匹配   - 如果'currency_data'表中没有这样的日期,则应该与之前的日期匹配。

所需的输出:

 ID  | rate | 
  1    3.50      
  2    3.46   
  3    4.62   
  4    4.62    
  5    3.51    

我的尝试:

SELECT gd.ID,
       (SELECT rate
          FROM currency_data cd
         WHERE cd.currecny = gd.currecny
           AND gd.date_act >= cd.rate_date
           AND ROWNUM = 1
           order by  cd.rate_date) rate
  FROM general_data gd
  order by 1

订购时出现语法错误,但我需要订购以获取最新信息。

2 个答案:

答案 0 :(得分:1)

这在Oracle中很难实现。在Oracle 12g中,您可以使用fetch first 1 row only

SELECT gd.ID,
       (SELECT rate
        FROM currency_data cd
        WHERE cd.currecny = gd.currecny AND
              gd.date_act >= cd.rate_date
        ORDER BY cd.rate_date
        FETCH FIRST 1 ROW ONLY
       ) rate
FROM general_data gd
ORDER BY 1;

但这仅适用于最新版本。不幸的是,使用两个子查询来使用rownum是有问题的,因为Oracle的范围规则不允许嵌套关联。

但是,有一个解决方案:

SELECT gd.ID,
       (SELECT MAX(rate) KEEP (DENSE_RANK FIRST ORDER BY cd.rate_date)
        FROM currency_data cd
        WHERE cd.currecny = gd.currecny AND
              gd.date_act >= cd.rate_date
       ) rate
FROM general_data gd
ORDER BY 1;

KEEP救援。

答案 1 :(得分:1)

SELECT gd.ID, cd.Rate
FROM general_data gd
LEFT OUTER JOIN currency_data cd
ON cd.currency = gd.currency
AND cd.rate_date =
(
SELECT max(rate_date) 
FROM currency_data cd
WHERE cd.currency = gd.currency
AND cd.rate_date <= gd.date_act
)
ORDER BY 1

Try it on SQLFIDDLE