如何从sql表中删除不需要的行值?

时间:2013-02-15 16:28:14

标签: sql sql-server tsql

我有一个奇怪的问题。我已经在我的公司sql db中添加了一些不需要的值。如何从我的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

3 个答案:

答案 0 :(得分: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 :(得分: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

这假设重复项由前两列确定,并且您希望将其保留为样本中的最低ColumnC值。

这是Demo

答案 2 :(得分: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

如果您有另一个字段(例如Tim Schmelter的答案),那么请使用它而不是SELECT NULL。

这是一个小提琴,展示了剩下的内容:http://sqlfiddle.com/#!3/29aec/4