返回colB由colB复制的所有MySQL行不是

时间:2014-02-12 18:12:07

标签: mysql sql

我们正在尝试在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。预期的结果是“这是你的结果”和更多“观看我的处理动画”。

我是否在正确的轨道上?我有一种更有效的方法吗?

非常感谢提前!

3 个答案:

答案 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 ;