我有一张桌子,用于为每个购买的产品存储一些系统选择的“序列号”......
问题是,上传的CSV我认为包含一些重复的“序列号”,这意味着当应用程序尝试修改行时,可能无法修改正确的行。
我需要能够查询数据库并获取serial_number
列的两倍的所有行。看起来应该是这样的:
ID, serial_number, meta1, meta2, meta3
3, 123456, 0, 2, 4
55, 123456, 0, 0, 0
6, 345678, 0, 1, 2
99, 345678, 0, 1, 2
正如您所看到的,我需要能够看到原始行和重复行及其所有数据列...这样我就可以比较它们并确定哪些数据现在不一致。< / p>
答案 0 :(得分:1)
SELECT *
FROM
yourtable
WHERE
serial_number IN (SELECT serial_number
FROM yourtable
GROUP BY serial_number
HAVING COUNT(*)>1)
ORDER BY
serial_number, id
答案 1 :(得分:1)
某些版本的MySQL实现in
子查询的效率非常低。一个安全的选择是加入:
SELECT t.*
FROM t join
(select serial_number, count(*) as cnt
from t
group by serial_number
) tsum
on tsum.serial_number = t.serial_number and cnt > 1
order by t.serial_number;
另一种方法是使用exists
子句:
select t.*
from t
where exists (select * from t t2 where t2.serial_number = t.serial_number and t2.id <> t.id)
order by t.serial_number;
这些查询(以及@fthiella提出的查询)都是标准SQL。两者都将受益于(serial_number, id)
上的索引。