2012-03-25 51 views
2

我在sql server上使用java,並且我有重複客戶 (許多客戶以下面的方式複製)的數據庫問題。 我的表是:在SQL中修復重複的客戶

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

和重複的客戶是這樣的:

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) 

333334335三排爲同一客戶,因爲它們具有相同的CUSTOMER_ID,我想只保留最後一個客戶(335),使334所有訂單和333指333

我最後的數據應該是:

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) 

如何爲所有我的重複客戶做這樣的查詢? (我有一個查詢返回CUSTOMER_ID的有重複的列表)

+0

有2分表間的任何外鍵約束? – 2012-03-25 15:32:15

+0

即使有我可以刪除約束 – 2012-03-25 15:51:24

回答

2

更新Order表:

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 ; 

然後,更新Customer表:

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 ; 

在此之後,這將是件好事,Customer(person_id)定義爲PRIMARY KEY或用UNIQUE約束。

而且從Order(person_id)一個FOREIGN KEY約束Customer(person_id)

+0

謝謝!,第一個查詢做了這項工作,我並不需要第二個儘管如此,我只是刪除了所有沒有最大人員ID的客戶。 – 2012-03-25 17:17:58

+0

是的,對,第二條語句應該是「刪除」而不是「更新」。 – 2012-03-25 20:18:00

-2

開始用這樣的:

select person_id from customer where customer_id = 040535743 

則是這樣的:

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

那麼你可以用MAX起到PERSON_ID結果。

+0

注意到我有很多重複的客戶,就像我給的例子。它不是一個客戶的問題 – 2012-03-25 15:30:32

+0

然後建議是玩這個基本結構的MAX和GROUP BY – Randy 2012-03-25 15:35:08

+0

我添加了一個更精確的解釋我想要什麼 – 2012-03-25 15:56:48