TSQL - 如何删除具有重复列的行?

时间:2014-01-29 16:45:35

标签: sql-server tsql

想象一下这张表:

| 1 | 2 | 1 | 2 | 1 |
| 1 | 2 | 3 | 2 | 1 |
| 1 | 2 | 3 | 4 | 1 |

如何删除具有重复值的行,排除第一列和最后一列......我很可能会以一种尴尬的方式思考这个问题。 e.g:

第一行:1 2 1 2 1 - 它有两个2和3个1。我想删除它,因为:它有两个2,中间1可以在行的开头或结束列中找到。

第二行:1 2 3 2 1 - 它有两个2。我想删除它,因为:它有两个2。

第三排:很好。第一列和最后一列的重复值无关紧要,两者之间的值不同!

我可以想象一些尴尬的方法,但由于SQL不是我最强的质量,我想听听专业人士的意见:)。

3 个答案:

答案 0 :(得分:2)

DELETE
FROM MyTable
WHERE
  CASE [Col1] WHEN [Col5] THEN 4 ELSE 5 END
  > (SELECT COUNT(DISTINCT v) FROM ( VALUES ([Col1]),([Col2]),([Col3]),([Col4],([Col5]) ) t(v) )

答案 1 :(得分:0)

这可能看起来很麻烦,但它确实起到了作用:

SELECT *
FROM YourTable
WHERE Col2 NOT IN (Col1,Col3,Col4,Col5)
AND Col3 NOT IN (Col1,Col2,Col4,Col5)
AND Col4 NOT IN (Col1,Col2,Col3,Col5)

Here is a sqlfiddle让你尝试。

答案 2 :(得分:0)

另一种选择:

DELETE FROM atable
WHERE EXISTS (
  SELECT 1
  FROM (
    SELECT col1
    UNION
    SELECT col5
    UNION ALL
    SELECT col2
    UNION ALL
    SELECT col3
    UNION ALL
    SELECT col4
  ) AS s (col)
  HAVING COUNT(*) > COUNT(DISTINCT col)
);

对于每一行,五列作为行组合成一个虚拟数据集,col1col5列与UNION组合,以消除它们之间的重复,另一行要添加UNION ALL的列。然后将结果集中的行计数与唯一值的数量进行比较。如果这些结果不同,则删除给定的行。