首页 > 解决方案 > 从 SELECT 或 UPDATE 中的不同行中查找值

问题描述

我有一个充满植物名称的大型数据库。我有一列带有物种(拉丁)名称,还有一列带有荷兰名称。不幸的是,荷兰人的名字并不完整。

id      species                 name_nl 
2475    Ligustrum               Liguster            
2476    Ligustrum delavayanum   Bolliguster             
2477    Ligustrum japonicum     Japanse liguster                                    
12300   Ligustrum ibota         ...     
13937   Ligustrum sinense       ...         
13938   Ligustrum 'Vicaryi'     ... 

在我继续之前,一个小的植物学解释:一个物种名称由一个属 (Liguster) 和一个加词 (delavayanum) 组成。我的列表有一个属的默认名称(在本例中为 id 2475),我想用它来填写缺失的荷兰名称。我的策略是使用 SUBSTRING_INDEX 从物种名称中获取属,并使用它来查找通用名称,并用它更新行。所以我应该这样结束:

id      species                 name_nl 
2475    Ligustrum               Liguster            
2476    Ligustrum delavayanum   Bolliguster             
2477    Ligustrum japonicum     Japanse liguster                                    
12300   Ligustrum ibota         Liguster                        
13937   Ligustrum sinense       Liguster                            
13938   Ligustrum 'Vicaryi'     Liguster    

我尝试了这段 SQL(我现在使用 SELECT 而不是 UPDATE):

SELECT `species`, `name_nl`, SUBSTRING_INDEX(`species`, ' ', 1) as genus, ( SELECT name_nl WHERE species LIKE genus ) FROM `names_nl` WHERE name_nl='';

它很接近,但SELECT name_nl WHERE species LIKE genus坚持自己的行,这显然会产生 NULL。我希望它每次被调用时都选择 id 2475。这是可能的,如果是的话:如何?提前致谢!

标签: mariadb

解决方案


对于此示例数据,您可以使用子句中的运算符自联接表LIKEON获取默认属并使用空列值进行更新:

UPDATE names_nl n1
INNER JOIN names_nl n2 ON n1.species LIKE CONCAT(n2.species, ' %')
SET n1.name_nl = n2.name_nl 
WHERE n1.name_nl = '';

请参阅演示


推荐阅读