我有两张桌子。
表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 -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个不同的值,以','分隔
答案 0 :(得分:7)
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
非规范化数据只应存储为性能改进,在之后确定为必要 - 不之前。
TABLE_A和TABLE_B之间需要一个多对多表来保存以逗号分隔的列表中表示的关系。
答案 1 :(得分:2)
为了尝试提供您所要求的内容,请在下方提供一个查询。但是,如果有数十或数十万的值,我对它的表现并不乐观。
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)
三个或条件是值是第一个值,最后一个值或任何中间值。你不能只说'%' + a.col2 + '%'
,因为它理论上可以匹配数字集的一部分,而不是整个值。即%11.2 -24.5%
可以匹配111.2 -24.56
。
答案 2 :(得分:1)
与this question类似,FIND_IN_SET建议的Shakti Singh功能应该适合您。但是,如果你在一个列中有这么多的值,我想它会非常慢。
最好是创建一个子表。
答案 3 :(得分:0)
300个不同的值这显然不是一个字段。嵌套表可能是一个更好的名称。
你做错了。如果单个字段包含大约300条记录,则应将其保留为不同的表。
答案 4 :(得分:0)
虽然我同意建议规范化数据库的答案,但我要指出,如果你没有与MySQL结婚,Postgresql有一个带有ANY()谓词的数组类型可以满足你的需要。但是,除了哲学问题之外,如果你将这种情况标准化,索引也可能会给你带来更好的表现。 AFAIK,无法对阵列版本进行有效索引。