Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL左连接填充前一个值(如果为null)_Mysql_Left Join - Fatal编程技术网

MySQL左连接填充前一个值(如果为null)

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

假设我有两张桌子

表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 - 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