2013-12-10 55 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字段是否有索引。

相關問題