想象一下这张表:
| 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不是我最强的质量,我想听听专业人士的意见:)。
答案 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)
);
对于每一行,五列作为行组合成一个虚拟数据集,col1
和col5
列与UNION
组合,以消除它们之间的重复,另一行要添加UNION ALL
的列。然后将结果集中的行计数与唯一值的数量进行比较。如果这些结果不同,则删除给定的行。