我正在尝试链接两个具有匹配字段的表,但字段的值不是相同的格式。例如,匹配字段名称是“序列ID”,并且一个表中的值可以是“134A-AC65”,但是另一个表中的值可以是“134A_AC65”或任何其他字符组合。问题是数据库表没有设置任何类型的约束,并且数据是由在现场操作的最终用户手动输入的,因此输入的准确性是有问题的。到目前为止,我已经找到了两个表中存在的匹配值,所以我知道表可以链接,但我需要知道是否有其他匹配值,但由于数据输入不佳,目前可能无法匹配。有任何想法吗?谢谢。
答案 0 :(得分:1)
值似乎包含"数据"和"分隔符"。这里成功的关键是知道所有分隔符是什么。
create table table_1 (
serial_id varchar(15) primary key
);
insert into table_1 values ('134A-AC65');
insert into table_1 values ('232A/AC65');
insert into table_1 values ('333:A:AC65');
create table table_2 (
serial_id varchar(15) primary key
);
insert into table_2 values ('134A_AC65');
insert into table_2 values ('232A_AC65');
insert into table_2 values ('333|A|AC65');
五种不同的分隔符,' - ',' _',':',' |',' /&#39 ;. 我只是用空格替换它们以便加入。
select table_1.serial_id, table_2.serial_id
from table_1
inner join table_2
on translate(table_1.serial_id, '-_:|/', ' ') = translate(table_2.serial_id, '-_:|/', ' ');
这就是PostgreSQL执行连接的方式。 (Oracle translate()类似。)
134A-AC65 134A_AC65 232A/AC65 232A_AC65 333:A:AC65 333|A|AC65
通常,这是您要修复的数据错误,因为表达式上的连接往往很慢(ish)。这样做的方法不止一种。您可以就地更新值。您可以为每个表添加一列,使用"右键"更新该列。 serial_id的值,并加入新列。 (清理任务由读者完成。)
答案 1 :(得分:0)
您应该为每个表添加CanonicalID
列。然后编写一个查询以从每个表中的CanonicalID
值设置SerialID
。设置完所有CanonicalID
值后,可以根据这些列执行连接。像这样:
create table t1 (
serialid varchar(50),
...other columns...
);
alter table t1
add column canonicalid varchar(50);
update table t1
set canonicalid = upper(replace(serialid, '_', '-'));
/* This might need to be more complex, depending on the kind of problems
you have in the serialid field */
...与表t2
现在您可以加入t1.canonicalid = t2.canonicalid