我有一个名为USERS的表,它有几个字段,包括一个名为'varchar'(6)类型的'postal'。
然后我有另一个名为POSTALS的表只有一列:'varchar'类型的'postal'(6)。 这个POSTALS表有大约200,000条记录。
我需要从USERS表中获取所有记录,其中该表中的“邮政”与POSTALS表中的“邮政”匹配。
我尝试了明显的基本查询:
SELECT users.user_id, users.user_fname, user_lname
FROM users, postals
WHERE replace(user_postal , ' ','') = postals.postal
但是这个查询永远不会完成。它总是超时。我可以看到这将是一个资源非常密集的查询,因为它将'用户'(有大约250,000行)的每个值与'邮政'(几乎有200,000行)的每个值进行比较。
还有其他更简化的方法来进行这种比较吗? 感谢。
答案 0 :(得分:0)
试试这个:
SELECT u.user_id, u.user_fname, u.user_lname
FROM users u WHERE EXISTS (SELECT DISTINCT postal FROM postals WHERE postal = u.postal)
答案 1 :(得分:0)
鉴于两者都是varchar(6)
,为什么要替换空格?
SELECT u.user_id, u.user_fname, u.user_lname
FROM users u join
postals p
on u.user_post = p.postal;
要使此运行更快,请在postals
表上创建索引:
create index postals_postal on postals(postal);
答案 2 :(得分:0)
从您的问题中调用replace
的原因并不明显。你需要剥离所有空间吗?这个函数调用每次比较(以及潜在的索引缺失)将会杀死你的查询。
首先要检查两个表中的postal
字段是否有索引。