4

我的 Access 数据库中有两个表ab。在这两个表中,我都有字段 ID。但是,在表a中,我的 ID 字段以“31”为前缀,其中表b中的我的 ID 字段中的我的 ID 字段则没有。

所以例如

table a                 table b

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

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

例如,类似于以下内容:

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

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

4

3 回答 3

4

CONCATENATE()Access SQL 中不支持。通常,您将&用于连接。

但是我认为你不需要为你的加入ON条件连接任何东西。只需使用Mid()忽略前 2 个字符...

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

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

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

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

ON a.ID = b.ID

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

于 2016-03-17T14:49:06.077 回答
1

为什么不将查询更新为:

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

希望这可以帮助?

于 2016-03-17T14:48:52.493 回答
0

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

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

一些数据库仍会b.ID为此查询使用索引。

于 2016-03-17T14:58:47.943 回答