2012-10-25 15 views
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 
+-------------------------+ 

Chcę znaleźć duplikaty rekordów w tej tabeli według dwóch kryteriów. Pierwsza to SKU, druga to UPC. W tym przypadku duplikaty rekordów wynoszą [1,2,3,4] i [5,6]. Wiersze [1,2] są duplikowane, ponieważ liczby sku są dopasowane. Wiersze [1,3,4] są duplikatami, ponieważ numery UPC są dopasowane. Pierwszy duplikat grupa powinna wyglądać następująco:Znajdź duplikaty rekordów w tabeli według więcej niż jednego kryterium:

GROUP1 *

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

Drugi duplikat grupa powinna wyglądać następująco:

GROUP2 *

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

Jak mogę znaleźć te grupy za pomocą zapytania mysql? Po znalezieniu duplikatów rekordów ustawiam grouID * * * dowolnego duplikatu rekordu w tabeli.

Próbowałem tego, ale nie pokazywałem wszystkich duplikatów.

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

Jest to schemat SQL:

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

Ten powrót zapytanie pusty wynik.

+1

że SQL strona skrzypce jest genialna na pytania SQL, dzięki za wprowadzenie –

Odpowiedz

0

Jeśli masz 2 zapytania, które robią, co chcesz i zwracają te same kolumny, możesz użyć UNION, aby pojawiły się jako jeden zestaw wyników.

ta może zawierać zduplikowane-duplikaty chociaż (rekordy, które pojawiają się w obu duplikatów zapytań)

Edycja: Lub użyć podzapytania

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

(Muszę wrócić do pracy teraz, ale mam nadzieję, to będzie można dostać się na drodze do rozwiązania)

+0

to wybrać SKU, UPC, count (SKU) z inw GDZIE sku nie jest null GROUP przez SKU HAVING count (SKU)> 1 UNION wybierz sku, upc, count (upc) od inv GDZIE sku nie jest pusty GROUP BY upc HAVING count (upc)> 1 i to nie zwraca poprawnie wyniku – dido

+0

To nie jest dokładny mecz (przepraszam, muszę iść) ale może pomóc: 'wybrać * z inv, gdzie upc in (wybrać upc z grupy inv przez upc uwzględniając count (upc)> 1) unii wybierz * z inv gdzie sku w (wybierz sku z grupy inv przez sku h aving count (sku)> 1); ' –

+0

Dodam do odpowiedzi, aby było czytelne –

0

Oto zapytanie, które pokazują zduplikowane wpisy jako pojedynczy wynik:

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 

realizuje to połączenie stołu ze sobą i szukanie wyraźnego dopasowania.

Powiązane problemy