2013-12-10 54 views
1

我有一个名为USERS的表,其中有几个字段,其中一个名为'varchar'(6)类型的'postal'。查找与200,000条记录表中的另一个值匹配的varchar值

然后我有另一个名为POSTALS的表,它只有一列:'邮政'类型'varchar'(6)。 这张邮政表有大约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行)的每个值进行比较。

其他更简化的比较方式? 谢谢。

+1

也许在该列上做TRIM并尝试在加入之后加入它们。将负载分开。 – Mihai

+1

你需要'替换'吗?使用它将删除用户表中该字段的任何索引。 – user2480596

回答

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) 
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); 
0

的原因调用replace是不是从你的问题很明显。是否有理由需要去除所有空间?这个函数在每次比较时都会调用(以及潜在的索引缺失),这会导致查询失败。

首先要检查两个表中的postal字段是否有索引。

相关问题