2013-08-26 21 views
2

我花了一點時間尋找這種情況,發現很多東西都很近,但我無法讓它適應我的情況。刪除(我的查詢)以外的所有行

爲了簡化,我有表筆與contact_idCode

contact_id   Code 
__________   ____ 
123456    100 
123456    200 
123456    300 
987654    100 
987654    200 
654321    300 

對於每個contact_id我要選擇具有最高的代碼行和刪除等。我沒有拿出一個select語句,以顯示我想要的表格看起來像:基於上述

select distinct contact_id, MAX(code) OVER(Partition by contact_id) AS code 
from t 

那麼我的結果集爲:

123456    300 
987654    200 
654321    300 

如何刪除除外的所有行由此選擇語句生成的。我嘗試使用NOT IN子句,但這當然不會支持多列。

回答

1

我會保存想要的行(在一個變量或某物中),然後刪除整個表,然後將它們重新插入爲新行。

+0

只是一個想法的人,沒有必要恨我。此外,爲什麼人們必須對帖子進行這樣輕微,不必要的編輯?很煩人。 – totallyuneekname

+0

在某些條件下(作爲一次性批處理作業,剩餘數據集較小的大表),這可能是最有效的解決方案。 –

1

嘗試類似:

with cte as 
(
    select * 
    , rownum = row_number() over (partition by contact_id order by code desc) 
    from t 
) 
delete cte 
where rownum <> 1 

SQL Fiddle with demo

+0

非常簡單。謝謝。 –

+1

不客氣!如果答案有助於解決您的問題,請考慮將其設置爲已接受的http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work。 –

1

試試這個:

DELETE atable 
FROM atable at 
INNER JOIN ( 
    SELECT contact_id, code = MAX(code) 
    FROM atable 
    GROUP BY contact_id 
) q ON at.contact_id = q.contact_id AND at.code < q.code 

但如果你有超過1排有一對contact_id + code會產生每CONTACT_ID每超過1行。

0

沒有熱膨脹係數也不子查詢:

DELETE t1 FROM t t1 
LEFT OUTER JOIN t t2 
ON t1.contact_id = t2.contact_id AND t1.code < t2.code 
WHERE t2.code IS NOT NULL; 

小提琴here.

相關問題