我们正在尝试查找 MySQL 数据库中的数据错误,但我想不出一种在不破坏数据库的情况下处理此问题的方法。
这是数据模型:
Table: EXAMPLE
+-----+------+-------+
| ID | PID | YEAR |
+-----+------+-------+
| | | |
| 001 | A | 2014 |
| | | |
| 002 | B | 2014 |
| | | |
| 003 | A | 2014 |
| | | |
| 004 | A | 2009 |
| | | |
| 005 | B | 2014 |
| | | |
| 006 | C | 2014 |
| | | |
| 007 | C | 2014 |
+-----+------+-------+
目标是返回 PID 和 YEAR 彼此不同步的所有行。如果有三行 PID 匹配但其中任何一行的 YEAR 错误,我们需要返回所有行。
在上面的示例数据中,将返回以下内容:
+-----+------+-------+
| ID | PID | YEAR |
+-----+------+-------+
| | | |
| 001 | A | 2014 |
| | | |
| 003 | A | 2014 |
| | | |
| 004 | A | 2009 |
+-----+------+-------+
到目前为止,我处理的查询如下所示:
SELECT EXAMPLE.ID, EXAMPLE.PID, EXAMPLE.YEAR
FROM EXAMPLE
INNER JOIN
(SELECT PID FROM EXAMPLE where PID HAVING COUNT(PID) > 1 GROUP BY PID) tmpTbl
ON EXAMPLE.PID = tmpTbl.PID
问题是在我的真实数据集中,子查询返回数据库中 255k 行中的 26k。预期结果不是“这是你的结果”,而是更多“观看我的处理动画”。
我走在正确的轨道上吗?有没有我忽略的更有效的方法?
非常感谢!
最佳答案
您可以使用 exists
子查询代替:
select e.*
from example e
where exists (select 1
from example e2
where e2.pid = e.pid and
e2.year <> e.year
);
为了让它运行得更快,在 example(pid, year)
上创建一个索引。
如果您只想要所有年份并且可以将它们排成一行,那么这可能就足够了:
SELECT PID, group_concat(year) as years
FROM EXAMPLE
where PID
GROUP BY PID
HAVING COUNT(DISTINCT year) > 1 ;
关于mysql - 返回所有 colA 与 colB 不重复的 MySQL 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736159/