SQL 在前缀字段和非前缀字段上连接两个表的查询
SQL Query that joins two tables on a prefixed and non prefixed field
我的 Access 数据库中有两个 tables a 和 b。在两个 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
上的索引来进行此查询。
我的 Access 数据库中有两个 tables a 和 b。在两个 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
希望这有帮助吗?
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
上的索引来进行此查询。