5
+-------------------------+
| SKU  |  UPC  |   NAME   | INVID
+-------------------------+
| 001  |  111  |   NAME1  |  1
| 001  |  null |   NAME2  |  2
| 0-1  |  111  |   NAME3  |  3
| -01  |  111  |   NAME4  |  4
| 002  |  222  |   NAME5  |  5
| 002  |  null |   NAME6  |  6
| 003  |  333  |   NAME7  |  7
+-------------------------+

我想通过两个标准在这个表中找到重复的记录。首先是SKU,其次是UPC。在这种情况下,重复记录是 [1,2,3,4] 和 [5,6]。行 [1,2] 是重复的,因为 sku 编号匹配。行 [1,3,4] 是重复的,因为 UPC 编号匹配。第一个重复组应如下所示:

第 1 组*

+-------------------------+
| 001  |  111  |   NAME1  |  1
| 001  |  null |   NAME2  |  2
| 0-1  |  111  |   NAME3  |  3
| -01  |  111  |   NAME4  |  4
+-------------------------+

第二个重复组应如下所示:

组2*

+-------------------------+
| 002  |  222  |   NAME5  |  5
| 002  |  null |   NAME6  |  6
+-------------------------+

如何使用 mysql 查询找到这些组?如果我发现重复记录,我会在表中设置任何重复记录的 grouID* * *。

我试过了,但没有显示所有重复项。

select sku, upc
from inv
WHERE sku is not null 
GROUP BY sku, upc HAVING count(sku)  > 1 OR count(upc)  > 1

这是 SQL 模式:

http://sqlfiddle.com/#!2/4d760/2

此查询返回空结果。

4

2 回答 2

0

这是一个将重复条目显示为单个结果的查询:

select distinct i1.*
  from inv i1, inv i2
  WHERE i1.sku is not null AND 
    (i1.sku = i2.sku OR i1.upc = i2.upc) AND i1.idinv != i2.idinv
  ORDER BY idinv

这是实现将表与自身连接并寻找不同的匹配。

于 2012-10-25T12:29:24.783 回答
0

如果您有 2 个查询执行您想要的操作并返回相同的列,您可以使用 UNION 使它们显示为一个结果集。

这可能包括重复重复(出现在两个重复查询中的记录)

编辑:或使用子查询

select * from inv where upc in (select upc from inv group by upc having count(upc) > 1) 
union
select * from inv where sku in (select sku from inv group by sku having count(sku) > 1);

(我现在必须回去工作,但希望这会让你走上解决问题的道路)

于 2012-10-25T12:18:57.740 回答