在前缀和非前缀字段

时间:2016-03-17 14:42:22

标签: sql ms-access left-join ms-query

我的Access数据库中有两个表 a b 。在两个表中我都有字段ID。但是,在表格 a 中,我的ID字段前缀为“31”,而表格 b 中的ID字段不是。

所以例如

table a                 table b

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

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

所以例如:

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

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

3 个答案:

答案 0 :(得分:4)

Access SQL不支持

CONCATENATE()。通常,您将使用&进行连接。

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

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编入索引以获得最佳效果。

答案 1 :(得分: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

希望这有帮助吗?

答案 2 :(得分:0)

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

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

对于此查询,某些数据库仍会在b.ID上使用索引。