我有两个表查询。
第一个表格如下:
| id | Number |
+--------+-------------+
| 1 | WDX |
| 2 | ABd32 |
| 3 | CACY |
和第二个像:
| id | realNumber |
+--------+-------------+
| 1 | w_WDX_zed |
| 2 | ABd32_ala |
| 3 | guava |
输出需要看起来像:
| id | output |
+--------+-------------+
| 1 | w_WDX_zed |
| 2 | ABd32_ala |
| 3 | CACY |
在第一张表中有车牌,第二张表有plates_username。我需要连接它们并更新第一个表以匹配。
我试图这样做:
UPDATE `TAB_a` a, `TAB_b` b
SET a.`Number` = b.`realNumber`
WHERE a.`Number` LIKE CONCAT('%',b.`realNumber`,'%') AND a.Number <> b.`realNumber`;
但这不起作用。
答案 0 :(得分:0)
update plates p
inner join plate_users pu
on pu.realNumber like concat(concat('%', p.number), '%')
set p.number = pu.number
然而,这是充满危险的 - 如果有板块是另一个板块的子串,你很可能会得到不想要的结果。
如果realNumber应该是,那么第一个是 _?如果那些类型不在那里,那将更容易和更安全。
修改强>
好的,在下面的更多信息之后,您可以尝试以下两个选项:
update plates p
inner join plate_users pu
on pu.number like concat('%\_', p.number)
or pu.number like concat(p.number, '\_%')
or pu.number like concat(concat('%\_', p.number), '\_%')
set p.number = pu.number
小提琴:http://sqlfiddle.com/#!9/e8999/1
和
update plates p
inner join plate_users pu
on pu.number REGEXP concat(concat('.*_?', p.number), '_?.*')
set p.number = pu.number
小提琴:http://sqlfiddle.com/#!9/c5bc7/1
以上所有内容都会在您的最小数据集上提供所需的结果,但强烈建议您在对实时数据运行任何这些数据之前备份数据。
最后两个选项更可取,因为它们在realNumber中至少需要一个下划线。