我的问题听起来很怪异,但请耐心等待。这就是我所拥有的:
餐桌产品
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”。
感谢您的帮助。谢谢!
答案 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)
您可以将CTE
与Row_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);