Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 使用另一行中的字段更新行空值_Mysql - Fatal编程技术网

Mysql 使用另一行中的字段更新行空值

Mysql 使用另一行中的字段更新行空值,mysql,Mysql,我希望用另一行中的值更新一行中的任何空值,这些值通过不同的表链接。其思想是更新初始值,以便从另一个获取任何额外信息。我创造这个环境是为了展示我想要发生的事情 测试数据: id value ------------ 1 null 2 null 3 TEST id value ------------ 1 TEST 2 null 3 TEST 测试选项: id1 id2 ------------ 1 2 1 3

我希望用另一行中的值更新一行中的任何空值,这些值通过不同的表链接。其思想是更新初始值,以便从另一个获取任何额外信息。我创造这个环境是为了展示我想要发生的事情

测试数据:

id    value
------------
1     null
2     null
3     TEST
id    value
------------
1     TEST
2     null
3     TEST
测试选项:

id1    id2
------------
1     2
1     3
这是我一直未能成功使用的查询:

UPDATE test_data AS A
INNER JOIN test_alt ON A.id=test_alt.id1
INNER JOIN test_data AS B ON test_alt.id2=B.id
SET A.value = IF(A.value IS NULL, B.value, A.value);
测试数据的预期结果:

id    value
------------
1     null
2     null
3     TEST
id    value
------------
1     TEST
2     null
3     TEST
查询后的结果:

id    value
------------
1     null
2     null
3     TEST

首先应该提到的是:我需要获取任何非空值,它与哪个值无关,因此得到了一个答案。

可能是这样的

UPDATE test_data a
SET a.value = (SELECT b.value FROM test_alt c JOIN test_data b ON(c.id2 = b.id) 
               WHERE a.id = c.id1)
WHERE a.value IS NULL

如果您真的不在乎选择了哪些非空值,那么您可以加入并限制,例如

drop table if exists test_data,test_Alt;
create table test_data( id int, value varchar(100));
insert into test_data values
(1  ,   null),
(2  ,   null),
(3  ,   'TEST'),
(4  ,   'anotherTEST');

create table test_alt(id1 int,   id2 int);
insert into test_alt values
(1  ,   2),
(1  ,   3),
(1  ,   4);

update test_data t 
join (
select id1,value
from test_alt
join test_data on id2 = id
where value is not null
order by value asc limit 1
) s on s.id1 = t.id 
set t.value = s.value
;

select * from test_data;

+------+-------------+
| id   | value       |
+------+-------------+
|    1 | anotherTEST |
|    2 | NULL        |
|    3 | TEST        |
|    4 | anotherTEST |
+------+-------------+
4 rows in set (0.00 sec)

如何失败?有没有办法确定3是测试中最新的id2?例如自动增量id列或日期,您不必加入两次。。test_data和test_alt之间的一个连接就可以了。@RaymondNijland他确实需要连接两次。.他确实需要连接两次No@sagi UPDATE test_data internal JOIN test_alt ON test_data.id=test_alt.id1 SET test_data.value='test',其中test_data.value为NULL;工作正常->我得到了:1093-表“a”被指定了两次,既作为“更新”的目标,也作为单独的数据源-将使用此建议并查看是否有帮助,谢谢。如果从test_alt c JOIN test_data b ONc.id2=b.id中选择b.value,其中a.id=c.id1匹配多个记录,会发生什么情况。。然后查询将失败。这就是我的问题。愚蠢的错误,谢谢你的帮助!我看我也没有完全理解这个问题。没问题@sagi话题发起人的问题和评论至少会让convision感到欣慰。。我还尝试了一个答案,我认为这不是topicstarter需要的。@tomaszhrest你是什么意思?你成功地让查询工作了吗?这会工作的,首先为缺乏信息道歉,我是第一次!这会管用的,我第一次为缺乏信息道歉!现在我终于明白了您在@tomaszhrest后的想法。下次尝试获得更好的预期输出时没有问题,这样您就可以得到更好的帮助。我应该在示例中放置两个非空值,对此表示抱歉。