如何在MySql中基于部分匹配进行连接?
我有两张桌子 表A如何在MySql中基于部分匹配进行连接?,mysql,sql,Mysql,Sql,我有两张桌子 表A Column 1 Column 2 CT 3C 10.5 -23.12 OT 5A 11.2 -24.5 表B Column 1 Column 2 PRIM 12.3 -24.51, 10.5 -23.12, 61.24 -78.23 SEC 8.7345 -46.1934, 10.49 -49.1834 TERT 18.98 -28.12, 11.23 -24.78, 1.45
Column 1 Column 2
CT 3C 10.5 -23.12
OT 5A 11.2 -24.5
表B
Column 1 Column 2
PRIM 12.3 -24.51, 10.5 -23.12, 61.24 -78.23
SEC 8.7345 -46.1934, 10.49 -49.1834
TERT 18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5
联接后的结果表:
Column 1 Column 2 Column 3 Column 4
CT 3C 10.5 -23.12 PRIM 12.3 -24.51, 10.5 -23.12, 61.24 -78.23
OT 5A 11.2 -24.5 TERT 18.98 -28.12, 11.23 -24.78, 1.45 -24.11, 11.2 -24.5
有没有办法在不将“表B中的第2列”的内容拆分为单独的列的情况下进行匹配?“表B第2列”中的内容由“,”分隔
10.5-23.12应与12.3-24.51、10.5-23.12、61.24-78.23匹配,因为它包含在其中的值列表中
我无法将它们拆分为单独的列,因为在某些情况下,其中有多达300个不同的值由“,”分隔。300个不同的值。这显然不是一个字段。嵌套表可能是更好的名称 你做错了。如果单个字段包含大约300条记录,则应将其作为另一个表保留。类似于,建议的函数也适用于您。但是,如果在一列中有这么多值,我想速度会非常慢
最好是创建一个子表。为了满足您的要求,请在下面的查询中添加一个快照。然而,如果有数万或数十万个值,我对其性能并不乐观
select a.col1 as col1, a.col2 as col2, b.col1 as col3, b.col2 as col4
from tableA a
join tableB b
on (b.col2 like a.col2 + '%'
or b.col2 like '%,' + a.col2 + ',%'
or b.col2 like '%' + a.col2)
这三个or条件是值是第一个值、最后一个值或任何中间值。您不能只说'%'+a.col2+'%'
,因为理论上它可以匹配数字集的一部分,而不是整个值。i、 e.%11.2-24.5%
可以匹配111.2-24.56
短期解决方案
使用:
长期解决方案
非规范化数据仅应在确定有必要后作为性能改进存储--而不是之前的--
在表a和表B之间需要一个多对多表来保存逗号分隔列表中表示的关系。虽然我同意建议规范化数据库的答案,但我要指出,如果您没有与MySQL结婚,Postgresql有一个数组类型,它带有一个ANY()谓词,可以满足您的需要。然而,除了哲学问题之外,如果你将这种情况正常化,索引可能也会给你带来更好的性能。抱歉,数组版本无法有效地索引
SELECT a.column1, a.column2,
b.column1, b.column2
FROM TABLE_A a
JOIN TABLE_B b ON FIND_IN_SET(a.column2, b.column2) > 0