2011-12-02 43 views
1

所以我搞砸了,並填充了一個重複行的表...我有一個表這樣的事情(實際上千千萬萬像這樣的東西:-() :獲取在SQL表中有兩列的行的組

id gname  pname value 
1  15   13  test 
2  15   13  test 
3  15   13  test 
4  18   18  test 
5  18   18  test 
6  18   18  test 

此表只應該允許相同的gname,PNAME和價值的一排

所以現在我需要寫一些SQL即會組所有這些共同排在一起,把它們都刪除,除了一個!唉!

任何人都可以幫助我,第一步,我相信只是爲了得到一個聲明返回所有重複組。

**順便說一句 - 我知道這是完全頂起來的。這是我繼承的一個非常古老的系統,並且這是一個大客戶,因此我意識到這些問題。我可以修復導致這個問題的代碼,我將db恢復到原來的樣子。

謝謝!

回答

4

如果id是獨一無二的,自動遞增,這是很容易:

DELETE Table 
WHERE ID NOT IN (SELECT MIN(id) 
        FROM Table 
        GROUP BY gname, pname, value) 

做一個SELECT第一,雖然。

+0

打我也是吧。 –

+0

你是什麼意思'首先做一個選擇'? –

+0

@toddv:在執行刪除操作之前,一定要看看將要刪除的行,意思是 –

0

給這個鏡頭。它使用RANK函數來提取每個gname/pname/value元組中的第一個元素。

DELETE a 
FROM _table_ a 
JOIN 
(
    SELECT id 
     , RANK() OVER (PARTITION BY gname, pname, value ORDER BY id ASC) AS r 
    FROM _table_ 
) b 
    ON a.id = b.id 
    AND b.r > 1