首页 > 解决方案 > MySQL INNER JOIN 无法在大表中返回正确的数据

问题描述

我正在尝试比较数据库中两个表的记录。一个表(Clients)包含近 40,000 条记录,另一个表(Users)包含大约 1,500 条记录。这是我的 SQL 语句:

SELECT
   Clients.Name
 , Clients.IDCardNo
 , Users.IDCardNo
FROM
  Clients INNER JOIN Users
ON
  (Clients.IDCardNo = REPLACE(Users.IDCardNo, '-', ''));

(用户数据库中的客户身份证号有多余的连字符,我必须在比较之前删除这些连字符,因为在客户数据库中,没有身份证号有连字符。这就是我在 MySQL 中使用 REPLACE() 的原因)

令我惊讶的是,MySQL 返回了近 180,000 条记录(我的所有数据库中并没有那么多记录!)其中每条记录都有相同的 Clients.Name 和 Clients.IDCardNo!

这是 MySQL 中的一个错误,因为它无法扩展和处理大数据,还是我的 SQL 语句有问题?

标签: mysqlsql

解决方案


这不是数据库中的“错误”。这是如何JOIN工作的。您的数据中有重复项,这导致JOIN.

您可以使用以下查询来检查:

select c.IDCardNo
from clients c
group by c.IDCardNo
having count(*) > 1;

和:

select REPLACE(u.IDCardNo, '-', ''))
from users u
group by REPLACE(u.IDCardNo, '-', ''))
having count(*) > 1;

如果存在“错误”,则在数据或您的假设中这些IDCardNo是唯一的。


推荐阅读