2013-02-15 101 views
0

我有一個奇怪的問題。我在公司的sql db中添加了一些不需要的值。如何從我的sql表中刪除。如何從sql表中刪除不需要的行值?

columnA ColumnB ColumnC ColumnD ColumnE 
    1   22  3332 
    2   11  5543 
    3   11  4444 
    4   11  1234 
    4   11  1344 
    4   11  5666 

它必須是

columnA ColumnB ColumnC ColumnD ColumnE 
    1  22  3332 
    2  11  5543 
    3  11  4444 
    4  11  1234 
+0

什麼是保持哪一行的標準? – sgeddes 2013-02-15 16:29:16

+0

如果您發佈代碼,XML或數據樣本,**在文本編輯器中突出顯示這些行,並單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地格式化和語法突出顯示它!你不需要那些雜亂的' '和'
'標籤! – 2013-02-15 16:31:54

+1

@marc_s,他有748個聲望,並且已經有160個問題。不是新用戶。 – Kaf 2013-02-15 16:32:49

回答

4

的CTE和ROW_NUMBER功能

WITH CTE AS 
(
    SELECT columnA, ColumnB, ColumnC, ColumnD, ColumnE, 
     RN = ROW_NUMBER()OVER(PARTITION BY columnA, ColumnB ORDER BY ColumnC) 
    FROM dbo.TableName 
) 
DELETE FROM CTE WHERE RN > 1 

這issumes所有重複的由前兩列確定,要保持與最低ColumnC值作爲樣本。

這是Demo

+0

這是我一開始也認爲的方式。但是,這期望重複*總是*輸入更高的columnC值(正如他在數據示例中所示)。 – Kaf 2013-02-15 16:38:27

+0

@Kaf:我不知道(因爲OP沒有告訴我們)他想刪除什麼,這只是我們可以從他提供的小樣本中得到什麼。但我認爲他知道如何調整查詢一旦他了解它是如何工作的。 – 2013-02-15 16:42:16

+0

是的,我同意。 .... – Kaf 2013-02-15 16:43:26

4

所以你希望刪除的最後兩行?只要創建刪除匹配那些你想擺脫的標準,它(因爲它看起來像你沒有複製任何現有數據)聲明:

DELETE FROM MyTable 
WHERE ColumnA = 4 
AND ColumnB = 11 
AND ColumnC = 1344 

DELETE FROM MyTable 
WHERE ColumnA = 4 
AND ColumnB = 11 
AND ColumnC = 5666 

(當然代替「MyTable的」與實際名稱你的桌子,你沒有提供)。

1

因爲我們不知道你想保留哪些記錄,所以很難回答你的問題。如果你想保持你的第2列編組的第一條記錄,那麼這將是接近 - 儘管不能保證:

WITH CTE AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY col1,col2 ORDER BY (SELECT NULL)) RN 
FROM YourTable 
) 
DELETE FROM CTE WHERE RN<>1 

如果您有其他領域(如蒂姆Schmelter的答案),然後使用而不是SELECT NULL。

這裏是一個小提琴,顯示將保持什麼:http://sqlfiddle.com/#!3/29aec/4

相關問題