2012-03-25 15 views
2

Ich benutze Java auf SQL-Server und ich habe ein DB-Problem von doppelten Kunden (viele Kunden sind auf die folgende Weise dupliziert). Meine Tabellen sind:Fixing doppelte Kunden in SQL

CUSTOMER(person_id,customer_id) 
ORDER (order_id,person_id) 

und eine duplizierte Kunde sieht wie folgt aus:

CUSTOMER(333,040535743) 
CUSTOMER(334,040535743) 
CUSTOMER(335,040535743) 

ORDER (1,333) 
ORDER (2,333) 

ORDER (4,334) 
ORDER (5,334) 
ORDER (6,334) 

ORDER (7,335) 
ORDER (8,335) 
ORDER (9,335) 


CUSTOMER(336,009530650) 
CUSTOMER(337,009530650) 

ORDER (10,336) 
ORDER (11,336) 
ORDER (12,336) 

ORDER (13,337) 
ORDER (14,337) 
ORDER (15,337) 

333.334.335 sind drei Zeilen für den gleichen Kunden, weil sie die gleiche customer_id haben, ich nur die letzten Kunden behalten wollen (335), und stellen Sie alle Aufträge von 334 und 333 beziehen sich auf 333.

sollen meine letzten Daten sein:

CUSTOMER(335,040535743) 
ORDER (1,335) 
ORDER (2,335) 

ORDER (4,335) 
ORDER (5,335) 
ORDER (6,335) 

ORDER (7,335) 
ORDER (8,335) 
ORDER (9,335) 



CUSTOMER(337,009530650) 

ORDER (10,337) 
ORDER (11,337) 
ORDER (12,337) 

ORDER (13,337) 
ORDER (14,337) 
ORDER (15,337) 

Wie mache ich eine Abfrage, die das für alle meine doppelten Kunden tut? (Ich habe eine Abfrage, um die Liste der customer_id die Rückkehr, die Vervielfältigungen haben)

+0

Gibt es einen Fremdschlüssel zwischen den Tabellen 2? –

+0

auch wenn es gibt kann ich die Einschränkung entfernen –

Antwort

2

Aktualisieren der Order Tabelle:

UPDATE o 
SET o.person_id = cc.max_person_id 
FROM 
    [Order] AS o 
    JOIN 
    Customer AS c 
     ON c.person_id = o.person_id 
    JOIN 
    (SELECT customer_id 
      , MAX(person_id) AS max_person_id 
     FROM Customer 
     GROUP BY customer_id 
    ) AS cc 
     ON cc.customer_id = c.customer_id ; 

Dann aktualisieren Sie die Customer Tabelle:

UPDATE c 
SET c.person_id = cc.max_person_id 
FROM 
    Customer AS c 
    JOIN 
    (SELECT customer_id 
      , MAX(person_id) AS max_person_id 
     FROM Customer 
     GROUP BY customer_id 
    ) AS cc 
     ON cc.customer_id = c.customer_id ; 

Danach würde es gut sein Customer(person_id) als PRIMARY KEY definiert zu haben oder mit einem UNIQUE Zwang.

Und eine FOREIGN KEY Einschränkung Order(person_id)-Customer(person_id)

+0

Dank !, die erste Abfrage hat den Job, ich brauchte nicht die zweite eine, obwohl, ich lösche nur alle Kunden, die nicht die maximale Person ID haben –

+0

Ja, richtig, die zweite Anweisung sollte "DELETE", nicht "UPDATE" sein. –

-2

Start mit diesem:

select person_id from customer where customer_id = 040535743 

dann so etwas wie:

select * from orders where person id in (select person_id from customer where customer_id = 040535743) 

dann können Sie mit MAX spielen in der person_id Ergebnisse.

+0

Beachten Sie, dass ich viele Kunden dupliziert wie die Beispiele, die ich gab. es ist kein Problem für 1 Kunde –

+0

dann ist der Vorschlag, mit MAX und GROUP BY auf dieser grundlegenden Struktur – Randy

+0

Ich fügte eine genauere Erklärung dessen, was ich will –