根据优先级列重复列表的提示

时间:2009-07-31 02:43:06

标签: 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.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority

表A具有两个来源的相同列,但数据可能不同 - 因此它们可能具有不同的价格。挑战在于我必须从具有最高优先级的源的行中获取价格(以及所有其他信息)。更复杂的是,我没有来自所有来源的每个项目的数据。

因此,第1项可能包含来自源A和B的数据,而第2项可能只有来自源B和C的数据。因此,删除需要基于每个唯一项目进行。

2 个答案:

答案 0 :(得分:1)

我认为你可以这样做:

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是否具有子查询的范围,但不是。

答案 1 :(得分:0)

尝试使用ROW_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;

罗布