mysql - 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 语句有问题?
解决方案
这不是数据库中的“错误”。这是如何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
是唯一的。
推荐阅读
- angular - angular-google-charts 如何为条形图添加图例?
- php - 在 wordpress 中,无法将自定义注册表单数据插入数据库,并且我的 PHP 代码正在表单上打印(我保存在简码中)
- c++ - 创建从变量读取的 FILE*
- r - 如何在R中重复序列中的每个元素不同次数
- amazon-web-services - elasticbeanstalk 部署工作环境/var/pids/web.pid 失败:没有这样的文件或目录
- javascript - 我可以仅使用帧参考模拟在 Puppeteer 中按下“Enter”键吗?
- google-sheets - Google 表格 - 使用 3 列中的数据查找最常发生的事情
- node.js - 如何使用 ExpressJS 针对 mountPath 挂载 node-oidc-provider?
- javascript - React Ace Editor 值未显示
- security - 在 Electron 桌面应用程序中存储敏感信息的最佳实践