MySQL左连接填充前一个值(如果为null)
假设我有两张桌子 表a:MySQL左连接填充前一个值(如果为null),mysql,left-join,Mysql,Left Join,假设我有两张桌子 表a: ID - Value1 =========== 1 - A 2 - B 3 - C 4 - D 表B: ID - Value2 =========== 1 - AA 3 - NULL 4 - DD 这些表的正常联接可以是: 挑选* 从表A到表A TA.ID=TB.ID上的左联接表B TB 结果将是: ID - Value1 - Value2 ====================== 1 - A - AA 2 - B - NULL 3 - C
ID - Value1
===========
1 - A
2 - B
3 - C
4 - D
表B:
ID - Value2
===========
1 - AA
3 - NULL
4 - DD
这些表的正常联接可以是:
挑选*
从表A到表A
TA.ID=TB.ID上的左联接表B TB
结果将是:
ID - Value1 - Value2
======================
1 - A - AA
2 - B - NULL
3 - C - NULL
4 - D - DD
但是,在我的例子中,我想用前一行中的值填充实际缺少的空值,并保留实际为空的值,如下所示:
ID - Value1 - Value2
======================
1 - A - AA
2 - B - AA
3 - C - NULL
4 - D - DD
有没有办法做到这一点
编辑1:
我意识到我的问题问错了。。。很抱歉给你带来了困惑
实际上,我想保留联接表中是否有一个实际为NULL的值,如果该值不存在,则填充该值。尝试类似的方法-左内联接是获取表b中的每个值,如果存在,则获取前一个非NULL值,然后将其联接到表a,如果不为NULL,则获取值2,如果为NULL,则获取新值
SELECT f.id,f.value1,coalesce(p.value2,p.PrevValue2) as value2
FROM TableA f
LEFT OUTER JOIN(SELECT t.ID,t.Value2,
(select s.value2 from tableB s
where s.value2 is not null and s.id<t.id
order by s.id DESC limit 1) as PrevValue2
FROM TableB t) p
ON(p.id = f.id)
我已经更新了我的问题。。。错过了一件重要的事情。很抱歉我担心的是,在这种情况下,联接表TableB将保存时间序列数据,并可能包含数十亿行。ID当然是一个索引,但仍然。。。。我应该担心吗…?这似乎并没有减少它,或者我在实施它时可能做错了什么。无论如何谢谢你!我已经更新了我的问题。。。错过了一件重要的事情。很抱歉
SELECT TA.ID, TA.Value1,
if(isnull(Value2), @n, (@n:=Value2)) Value2
FROM TableA TA
LEFT JOIN
TableB TB
ON TA.ID = TB.ID
cross join(select @n:='') n