如何在SQL Server中确定两列完全匹配的行

时间:2018-08-17 16:22:13

标签: sql sql-server

我的问题听起来很怪异,但请耐心等待。这就是我所拥有的:

餐桌产品


ProductName     Cost   
Pen A           1.00  
Pen A           1.00  
Pen B           1.00   
Pen A           2.00  
Pen C           3.00  
Pen C           3.00  
Pen C           3.00

如何从中删除真实的重复项?如果查看数据,可以看到Pen C具有三行数据完全相同的行。笔A有2行具有相同的数据,而1行具有不同的成本。我不想删除“笔A”。

一个简单的分组语句,如下所示:

SELECT ProductName,Cost FROM PRODUCTS GROUP BY ProductName,Cost HAVING COUNT(*) > 1

这不会起作用,因为它也会拾取“笔A”。

感谢您的帮助。谢谢!

4 个答案:

答案 0 :(得分:1)

一种不使用联接或子查询的快速方法是创建具有相同结构的表PRODUCTS_TEMP并仅插入唯一的行:

INSERT INTO PRODUCTS_TEMP 
SELECT DISTINCT ProductName,Cost FROM PRODUCTS;

然后,您可以删除自己的PRODUCTS表,并将PRODUCTS_TEMP重命名为PRODUCTS:

DROP TABLE PRODUCTS;
ALTER TABLE PRODUCTS_TEMP RENAME TO PRODUCTS;

现在您已经过滤了表格。

答案 1 :(得分:1)

您可以将CTERow_Number()配合使用来删除重复对象

示例

;with cte as (
    Select * 
          ,RN = Row_Number() over (Partition By ProductName,Cost Order By (Select null))
    from PRODUCTS 
)
Delete from cte where RN>1

更新表

ProductName Cost
Pen A       1.00
Pen B       1.00
Pen A       2.00
Pen C       3.00

答案 2 :(得分:0)

在以任何方式清理了混乱之后,您可能想考虑在其中创建带有2列的约束索引和/或在插入新行之前进行验证以确保不存在组合。

祝你好运

答案 3 :(得分:0)

我认为您只需要一种成本的产品。如果是这样:

select productname
from products
group by productname
having min(cost) = max(cost);