Sql 基于优先级列重复删除列表的提示
我有一组包含重复项的行,因为数据来自多个源。我还有一个单独的参考表,指示这些数据源的优先级 是否有人提供了最有效的t-SQL消除此列表中重复数据的好技巧 基本上,我有:Sql 基于优先级列重复删除列表的提示,sql,tsql,duplicate-data,sql-delete,Sql,Tsql,Duplicate Data,Sql Delete,我有一组包含重复项的行,因为数据来自多个源。我还有一个单独的参考表,指示这些数据源的优先级 是否有人提供了最有效的t-SQL消除此列表中重复数据的好技巧 基本上,我有: SELECT a.*, b.priority FROM tableA as a JOIN tableB as b ON b.sourceId = a.sourceId 我一直把它放在一个临时表中,然后以一种奇怪的方式删除它,我认为这样会更有效 DELETE ta FROM #tmp ta JOIN #tmp tb ON ta
SELECT a.*, b.priority
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
我一直把它放在一个临时表中,然后以一种奇怪的方式删除它,我认为这样会更有效
DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority
删除ta
来自#tmp ta
加入#tmp tb
在ta.duplicateId=tb.duplicateId上
其中ta.priority
表A中两个来源的列相同,但数据可能不同,因此它们的价格可能不同。挑战在于,我必须从具有最高优先级的来源的行中获取价格(以及所有其他信息)。使事情复杂化的是,我没有所有来源的每一项数据
因此,项目1可能有来自源A和源B的数据,而项目2可能只有来自源B和源C的数据。因此,需要根据每个唯一的项目进行删除。我认为您可以这样做:
SELECT a.*, b.priority
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId)
我不记得tSql是否在子查询的作用域内。尝试使用ROW\u NUMBER查找您想要保留的,然后去掉其余的 …记住在前面的语句末尾加一个分号
with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
)
--select * from t
delete t
where priorityorder > 1;
Rob1)当您说您有重复的条目时,表A中两行重复的所有列是否都相同?如果它们不是,并且tableA.SourceId不同,并且tableB中只有一个匹配的源Id,并且您希望删除重复项,然后,只需在tableA上运行delete而不是temp表。它在这一点上确实有作用域-您能向我解释一下嵌套的select是如何连接的,以正确地获得正确的优先级吗?当然,这样,该查询将对tableA的每一行运行,因此,它在其上运行的行的sourceId的结果将是最高的。这就像在返回的每一行上运行一个函数。