如何在 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

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

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

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

这行不通,因为它也会拾取"笔会A"。

任何帮助,不胜感激。谢谢!

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

INSERT INTO PRODUCTS_TEMP 
SELECT DISTINCT ProductName,Cost FROM PRODUCTS;

然后,您可以删除"产品"表并将PRODUCTS_TEMP重命名为"产品":

DROP TABLE PRODUCTS;
ALTER TABLE PRODUCTS_TEMP RENAME TO PRODUCTS;

现在,您已筛选表。

您可以将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 列的约束索引和/或验证以确保在插入新行之前不存在该组合。

祝你好运

我认为你想要的产品只有一个成本。 㞖:

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

最新更新