Mariadb 在“选择”或“更新”中的不同行中查找值

Mariadb 在“选择”或“更新”中的不同行中查找值,mariadb,Mariadb,我有一个很大的数据库,里面有植物的名字。我有一列是物种(拉丁语)名称,还有一列是荷兰语名称。不幸的是,荷兰名字并不完整 id species name_nl 2475 Ligustrum Liguster 2476 Ligustrum delavayanum Bolliguster 2477 Ligustrum japonicum Japanse

我有一个很大的数据库,里面有植物的名字。我有一列是物种(拉丁语)名称,还有一列是荷兰语名称。不幸的是,荷兰名字并不完整

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'     ... 
在我继续之前,有一个小的植物学解释:一个物种名称由一个属(女贞属)和一个绰号(德拉瓦亚努姆)组成。我的列表中有一种属的默认名称(在本例中为ID2475),我想用它来填充缺少的荷兰语名称。 我的策略是使用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):

这很接近,但是
选择name\u nl,其中像genus这样的物种坚持自己的行,这显然会产生NULL。
我希望它每次调用时都选择ID2475。有可能吗?如果有,怎么可能?

提前谢谢

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

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 = '';
请参阅。

选择t1.id、t1.species、COALESCE(NULLIF(t1.name\u nl.)、t2.name\u nl)name\u nl
来自名称\u nl t1
在t2.species=SUBSTRING\u索引(t1.species,,,1)上连接名称\u nl t2;

更新名称\u nl t1
在t2.species=子字符串索引(t1.species,,,1)上连接名称
设置t1.name\u nl=t2.name\u nl
其中TRIM(t1.name_nl)='';

另一个建议-使用正则表达式从物种名称中提取第一个子字符串:

select nl1.species, coalesce(nl1.name_nl, nl2.name_nl)
  from names_nl nl1
  left outer join names_nl nl2
    on nl2.species = regexp_substr(nl1.species, '[^ ]+', 1, 1)

要填充的列名的值是多少?它是NULL还是“”?@forpas只是空的。连接表的两个副本-一个完整,另一个只有默认值。空可以是NULL或
'
'
或类似值。@fopas好的,它是“”。好消息:它可以工作。坏消息是:6522行受影响。(查询耗时205.6452秒。)不过,我将尝试了解您的查询是如何工作的。添加别名的地方对我来说是新的。似乎也能工作,而且几乎是瞬间:6429行受影响。(查询耗时0.3053秒。)但是,我需要找出此查询没有影响哪些93行,但受@forpas'版本的影响。@DiederikSlob只需比较forpas'查询和我的查询处理的行,查找我的查询未处理的
id
值,并查找差异情况。@forpas做了我没有要求的事情,但这很好:他的查询还得到了各种已知物种的荷兰语名称。因此,棘仙人掌有荷兰名字Schoonmodersstoel,现在被添加到棘仙人掌“Inermis”中。是否可以将此添加到您的查询中?我试图更改子字符串的索引,但获得名称的第二部分似乎并不简单。不管请求如何,硬币都掉了。我首先使用子字符串_索引(t1.species,,,2)运行更新,它捕获了物种匹配的所有情况。然后,我运行原始的更新来清除匹配的类型。这结合了你的速度和比forpas版本更好的结果。超级复制者谢谢!MariaDB似乎没有完全实现regexp\u substr。唉,答案应该符合问题上提供的标签的功能。因为这个问题是为[mysql]标记的,所以在编写任何答案时都希望[mysql]是正在使用的工具。但是,对于MariaDB,您只需在REGEXP\u SUBSTR调用中删除
…1,1
,就可以了。看,我刚刚意识到我已经找到了解决问题的方法。当我安装MySQL时,我认为它是MySQL的一个别致的名字,从此不再为它烦恼。我会改善我的生活,先生!
select nl1.species, coalesce(nl1.name_nl, nl2.name_nl)
  from names_nl nl1
  left outer join names_nl nl2
    on nl2.species = regexp_substr(nl1.species, '[^ ]+', 1, 1)