0

我有一张表,用于为购买的每种产品存储一些系统选择的“序列号”......

问题是,我认为上传的 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

如您所见,我需要能够同时看到原始行和重复行以及所有数据列......这样我就可以比较它们并确定哪些数据现在不一致。

4

2 回答 2

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
于 2013-07-23T22:24:18.997 回答
1

某些版本的 MySQLin使用子查询非常低效地实现。一个安全的替代方法是 join:

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).

于 2013-07-23T22:34:22.233 回答