返回colA被colB复制但未复制的所有MySQL行
我们试图在一个MySQL数据库中发现数据错误,我想不出一个不破坏数据库的方法来处理这个问题 以下是数据的模型:返回colA被colB复制但未复制的所有MySQL行,mysql,sql,Mysql,Sql,我们试图在一个MySQL数据库中发现数据错误,我想不出一个不破坏数据库的方法来处理这个问题 以下是数据的模型: Table: EXAMPLE +-----+------+-------+ | ID | PID | YEAR | +-----+------+-------+ | | | | | 001 | A | 2014 | | | | | | 002 | B | 2014 | | | |
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匹配,但其中任何一行的年份错误,则需要返回所有行
在上述示例数据中,将返回以下内容:
+-----+------+-------+
| 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行。预期的结果是少这里是你的结果和更多的观看我的处理动画
我走对了吗?有没有我忽略的更有效的方法
非常感谢
SELECT EXAMPLE.*
FROM
EXAMPLE INNER JOIN (SELECT PID
FROM EXAMPLE
GROUP BY PID
HAVING COUNT(DISTINCT Year)>1) Dup
ON Example.PID = Dup.PID
请看小提琴
请看小提琴
请看小提琴
请看小提琴。试试类似的东西
SELECT e.*
FROM example as e
WHERE EXISTS (SELECT PID FROM example as e1
WHERE e1.PID = e.PID AND e1.YEAR <> e.YEAR)
试试像这样的东西
SELECT e.*
FROM example as e
WHERE EXISTS (SELECT PID FROM example as e1
WHERE e1.PID = e.PID AND e1.YEAR <> e.YEAR)
试试像这样的东西
SELECT e.*
FROM example as e
WHERE EXISTS (SELECT PID FROM example as e1
WHERE e1.PID = e.PID AND e1.YEAR <> e.YEAR)
试试像这样的东西
SELECT e.*
FROM example as e
WHERE EXISTS (SELECT PID FROM example as e1
WHERE e1.PID = e.PID AND e1.YEAR <> e.YEAR)
您可以改为使用exists子查询执行此操作:
select e.*
from example e
where exists (select 1
from example e2
where e2.pid = e.pid and
e2.year <> e.year
);
您可以改为使用exists子查询执行此操作:
select e.*
from example e
where exists (select 1
from example e2
where e2.pid = e.pid and
e2.year <> e.year
);
您可以改为使用exists子查询执行此操作:
select e.*
from example e
where exists (select 1
from example e2
where e2.pid = e.pid and
e2.year <> e.year
);
您可以改为使用exists子查询执行此操作:
select e.*
from example e
where exists (select 1
from example e2
where e2.pid = e.pid and
e2.year <> e.year
);
子查询应使用countdistinct。这可能会大大加快查询速度。另外,have应该按照小组的顺序进行。这一区别不会给我带来任何结果。计数在我的代码中的正确位置,很抱歉。事实上,这应该是countdistincdt year,因为这就是你想要找到的差异。如果我理解正确的话,您不希望任何pid有多行。您的子查询应该使用countdistinct。这可能会大大加快查询速度。另外,have应该按照小组的顺序进行。这一区别不会给我带来任何结果。计数在我的代码中的正确位置,很抱歉。事实上,这应该是countdistincdt year,因为这就是你想要找到的差异。如果我理解正确的话,您不希望任何pid有多行。您的子查询应该使用countdistinct。这可能会大大加快查询速度。另外,have应该按照小组的顺序进行。这一区别不会给我带来任何结果。计数在我的代码中的正确位置,很抱歉。事实上,这应该是countdistincdt year,因为这就是你想要找到的差异。如果我理解正确的话,您不希望任何pid有多行。您的子查询应该使用countdistinct。这可能会大大加快查询速度。另外,have应该按照小组的顺序进行。这一区别不会给我带来任何结果。计数在我的代码中的正确位置,很抱歉。事实上,这应该是countdistincdt year,因为这就是你想要找到的差异。如果我理解正确的话,您不希望任何pid包含多行内容。我尝试运行此程序,但它仍然锁定了所有内容,并且从未返回结果。@VSack。你用索引运行了第一个吗?很好,在不到2分钟内返回结果!比破坏服务器要好得多。现在唯一的问题是它没有返回pid。字段返回为空。无需担心。这个数据集糟透了。谢谢你的帮助!我试着运行它,但它仍然锁定了所有内容,并且从未返回结果。@VSack。你用索引运行了第一个吗?很好,在不到2分钟内返回结果!比破坏服务器要好得多。现在唯一的问题是它没有返回pid。字段返回为空。无需担心。这个数据集糟透了。谢谢你的帮助!我试着运行它,但它仍然锁定了所有内容,并且从未返回结果。@VSack。你用索引运行了第一个吗?很好,在不到2分钟内返回结果!比破坏服务器要好得多。现在唯一的问题是它没有返回pid。字段返回为空。无需担心。这个数据集糟透了。谢谢你的帮助!我试着运行它,但它仍然锁定了所有内容,并且从未返回结果。@VSack。你用索引运行了第一个吗?很好,在不到2分钟内返回结果!比破坏服务器要好得多。现在唯一的问题是它没有返回pid。字段返回为空。无需担心。这个数据集糟透了。谢谢你的帮助!我试过运行这个,但它仍然锁定了所有内容,从未返回结果。我试过运行这个,但它仍然锁定了所有内容,从未返回结果。我试过运行这个,但它仍然锁定了所有内容,从未返回结果。我试过运行这个,但它仍然锁定了所有内容,从未返回结果。