连接两个表时返回最新值

时间:2018-01-16 10:47:17

标签: oracle-sqldeveloper

我正在尝试连接两个表并返回字段的最新值。

目前,如果aa.time_day不等于bb.time,则bb.time字段会返回null。我希望这会返回小于或等于aa.time_date值的最新值。

我的查询目前看起来像这样:

Select
  aa.day_time
  aa.name
  aa.value
  bb.name
  bb.target_value
  bb.time
FROM
x.table1 aa LEFT JOIN y.table2 bb
ON  aa.name = bb.name  AND aa.day_time=bb.time
WHERE aa.day_time = TO_DATE(‘01/01/2017’,’DD/MM/YYYY’)

搜索Stackoverflow和其他网站向我展示了一些解决方案,遗憾的是没有任何效果。下面的查询是我最接近成功的问题,因为它没有抛出错误消息,但它运行了几个小时,我不得不停止它。上面的查询工作大约5秒钟。

Select
  aa.day_time
  aa.name
  aa.value
  bb.name
  bb.target_value
  bb.time
FROM
x.table1 aa LEFT JOIN y.table2 bb
ON  aa.name = bb.name  AND aa.day_time=
  (SELECT MAX (bb.time)
    FROM y.table2
    WHERE  bb.time <= aa.day_time)
WHERE a.day_time = TO_DATE(‘01/01/2017’,’DD/MM/YYYY’)

我不熟悉SQL,所以非常感谢你提前给予的帮助。

1 个答案:

答案 0 :(得分:0)

如果这是oracle并且t1到t2之间存在一对多的关系,那么使用cte从t2找到最近的日期可能会这样做

DROP TABLE T1;
DROP TABLE T2;

CREATE TABLE T1(DAY_TIME DATE,NAME VARCHAR(3), VALUE NUMBER);
CREATE TABLE T2(DAY_TIME DATE,NAME VARCHAR(3), VALUE NUMBER);

TRUNCATE TABLE T1;
INSERT INTO T1(day_time,NAME,VALUE) VALUES (to_date('2018-01-01','YYYY-MM-DD'),'aaa',10);
TRUNCATE TABLE T2;
INSERT INTO T2(day_time,NAME,VALUE) VALUES (to_date('2017-01-01','YYYY-MM-DD'),'aaa',10);
INSERT INTO T2(day_time,NAME,VALUE) VALUES (to_date('2018-02-01','YYYY-MM-DD'),'aaa',10);
SELECT * FROM T1;
SELECT * FROM T2;

WITH cte AS
(
select name,day_time,value 
from T2
where T2.day_time = (select MAX(t3.DAY_TIME) FROM T2 t3 WHERE t3.DAY_TIME <= TO_DATE('2018-01-01','YYYY-MM-DD') and t3.name = t2.name)
)
SELECT t1.name,t1.day_time,t1.value,
       cte.name,cte.day_time,cte.value
from t1
left join cte on t1.name = cte.name 
where t1.day_time = to_date('2018-01-01','YYYY-MM-DD');

NAME DAY_TIME                    VALUE NAME DAY_TIME                    VALUE
---- ---------------------- ---------- ---- ---------------------- ----------
aaa  01-JAN-2018 00:00:00           10 aaa  01-JAN-2017 00:00:00           10 

如果在t2中根本没有条目,则select的t2侧将为空。