SQL 在前缀字段和非前缀字段上连接两个表的查询

SQL Query that joins two tables on a prefixed and non prefixed field

我的 Access 数据库中有两个 tables ab。在两个 table 中,我都有字段 ID。然而,在 table a 中,我的 ID 字段以“31”为前缀,而我在 table b 中的 ID 字段是不是。

例如

table a                 table b

ID      field2          ID     field3
31L123  test123         L123   123test
31L122  test321         L122   321test

我的前缀字段 table 是定期从 Excel 导出中导入的,我知道我可以删除 excel 级别的前缀,但是有没有办法将两个 tables 在 ID 字段上通过在 SQL 语句中的连接上使用某种连接函数是否有机会?

因此,例如:

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON CONCATENATE('31', a.ID) = b.ID
WHERE a.Field2 = 13

我不确定这是否是正确的方法 - 这就是为什么我似乎找不到任何关于我的问题的现有帮助(忽略导入前 excel 级别的字段处理).

您为什么不将您的查询更新为:

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON RIGHT(a.ID,4) = b.ID
WHERE a.Field2 = 13

您也可以取 a.ID,然后从 a.ID 的长度中减去 2 位数字,然后在 a.ID 长于 6 的情况下使用最右边的字符字宽。并且,重写,我们得到:

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON RIGHT(a.ID,LEN(a.ID)-2) = b.ID
WHERE a.Field2 = 13

希望这有帮助吗?

Access SQL 不支持

CONCATENATE()。通常您会使用 & 进行串联。

但是我认为您不需要为联接的 ON 条件连接任何内容。只需使用 Mid() 忽略前 2 个字符 ...

ON Mid(a.ID, 3) = b.ID

这应该可行,但随着表的增长,性能可能会变得不可接受。您应该在每次导入后立即通过 "cleaning" a.ID 值获得更好的性能...

UPDATE a
SET ID = Mid(ID, 3)
WHERE ID ALike '31%';

然后您的 SELECT 查询的连接可以使用更简单、更快的 ON 条件...

ON a.ID = b.ID

确保 ID 已编入索引以实现最佳性能。

我只想使用 MS Access 的字符串连接添加“31”:

SELECT Id, Field2, Field3 
FROM a LEFT JOIN
     b
     ON ("31" & a.ID) = b.ID
WHERE a.Field2 = 13;

某些数据库仍会使用 b.ID 上的索引来进行此查询。