我们正在尝试在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。预期的结果是“这是你的结果”和更多“观看我的处理动画”。
我是否在正确的轨道上?我有一种更有效的方法吗?
非常感谢提前!
答案 0 :(得分:1)
SELECT EXAMPLE.*
FROM
EXAMPLE INNER JOIN (SELECT PID
FROM EXAMPLE
GROUP BY PID
HAVING COUNT(DISTINCT Year)>1) Dup
ON Example.PID = Dup.PID
请参阅小提琴here。
答案 1 :(得分:1)
尝试类似
的内容SELECT e.*
FROM example as e
WHERE EXISTS (SELECT PID FROM example as e1
WHERE e1.PID = e.PID AND e1.YEAR <> e.YEAR)
答案 2 :(得分:1)
您可以使用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 ;