Oracle如何删除一张表内的重复数据,但保留最新的一条?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle如何删除一张表内的重复数据,但保留最新的一条?相关的知识,希望对你有一定的参考价值。
一张表根据customer_guid判断是否重复,删除其中的的重复数据,但保留时间最新的一条。
例如:
customer_guid createddate
12345 2015/2/1 08:00:00
12345 2015/2/9 17:00:00
则删除2月1日的这条数据,保留2月9日的这条。
现在只写出了判断重复的语句,不知道时间怎么判断了,初学Oracle,求助各位大神帮忙解答
DELETE from Table WHERE (customer_guid) IN ( SELECT customer_guid FROM Table GROUP BY customer_guid HAVING COUNT(customer_guid) > 1)
查询出你想要删除的重复数据用下面的SQL:
select * from table a where a.createdate < (select max(b.createdate) from table b where a.customer_guid=b.customer_guid);
删除的话就用这个了:
delete from table a where a.createdate < (select max(b.createdate) from table b where a.customer_guid=b.customer_guid); 参考技术A
参考这个
DELETE from Table t1WHERE createddate != ( SELECT max(createddate)
FROM Table t2
where t2.customer_guid=t1.customer_guid)
and exists ( select count(customer_guid)
from Table t3
where t3.customer_guid=t1.customer_guid
having count(customer_guid)>1 );本回答被提问者和网友采纳
联合所有但只保留 T-SQL 中一张表的重复项
【中文标题】联合所有但只保留 T-SQL 中一张表的重复项【英文标题】:Union All but keep only duplicates from one table in T-SQL 【发布时间】:2021-05-28 11:33:35 【问题描述】:我有两张表要合并。我只需要保留两个表之一的重复项。我试图找到它,但在任何地方都找不到。希望有人能帮忙。
例如: 表_1:
ID | Product | Amount |
---|---|---|
1 | A | 10 |
2 | B | 10 |
3 | C | 10 |
表_2:
ID | Product | Amount |
---|---|---|
3 | C | 9 |
4 | A | 100 |
5 | B | 100 |
想要的结果:
ID | Product | Amount |
---|---|---|
1 | A | 10 |
2 | B | 10 |
3 | C | 9 |
4 | A | 100 |
5 | B | 100 |
因此,请始终使用 table_2 中的重复项。在这个例子中,ID 3 是重复的,所以使用 table_2 的副本,数量为 9。
如何用 T-SQL 实现这一点?我使用了下面的代码:
Select * from Table_1 where Table_1.id != Table_2.id
Union All
Select * from Table_2
但随后我收到错误消息: '无法绑定多部分标识符“Table_2.ID”。'
【问题讨论】:
看我的回答。这个概念非常直接,因为当我们需要两个表的不同行时,我们使用联合。当我们使用所有记录时,我们使用 Union all。 还有什么比:***.com/a/67740103/8483417更简单的 【参考方案1】:使用not exists
:
Select t1.*
from Table_1 t1
where not exists (select 1 from table_2 t2 where t2.id = t1.id)
Union All
Select t2.*
from Table_2 t2;
【讨论】:
【参考方案2】:试试这个:
SELECT T1.*
FROM @Table1 T1
WHERE T1.ID NOT IN (SELECT ID FROM @Table2)
UNION
SELECT T2.*
FROM @Table2 T2
【讨论】:
还有一个问题,如果我需要添加一列来计算每个产品的数量?产品的金额/计数总和(对于 A,它是 (100 + 10) / 2 )如何将其包装在 T-SQL 中? 选择产品,数量 = SUM(1),金额 = SUM(Amount) FROM (***) GROUP BY Product。在括号之间,将 *** 替换为先前的答案/脚本。 @xris23 你最好使用UNION ALL
而不是UNION
(其他答案证明了这一点)。 UNION
隐式地将DISTINCT
应用于最终数据集,这会带来性能成本,【参考方案3】:
我假设你想要的是EXISTS
:
SELECT T1.ID,
T1.Product,
T1.Amount
FROM dbo.Table1 T1
WHERE NOT EXISTS (SELECT 1
FROM dbo.Table2 T2
WHERE T1.ID = T2.ID)
UNION ALL
SELECT T2.ID,
T2.Product,
T2.Amount
FROM dbo.Table2 T2;
不过,FULL OUTER JOIN
也可以工作如果ID
在两个表中都是唯一的:
SELECT ISNULL(T2.ID,T1.ID) AS ID,
ISNULL(T2.Product,T1.Product) AS Product,
ISNULL(T2.Amount,T1.Amount) AS Amount
FROM dbo.Table1 T1
FULL OUTER JOIN dbo.Table2 T2 ON T1.ID = T2.ID;
【讨论】:
【参考方案4】:Union 会给你结果。 Union 将始终返回唯一值。如果你使用 union all 你会得到所有的重复。您的答案是使用 union all。
SELECT
B.ID
,B.Product
,B.Amount
FROM
(
SELECT
A.ID
,A.Product
,A.Amount
,ROW_NUMBER() over (Partition BY ID, Product order by Amount ASC) AS [row_num]
FROM
(
SELECT
tb_1.*
FROM tb_1
UNION ALL
SELECT
tb_2.*
FROM tb_2
) AS A
) AS B
WHERE B.[row_num] = 1
【讨论】:
以上是关于Oracle如何删除一张表内的重复数据,但保留最新的一条?的主要内容,如果未能解决你的问题,请参考以下文章
SQLServer如何将一个表内的所有数据导入另一个表后,删除表内的所有数据