我有一组包含重复条目的行,因为数据来自多个来源。我还有一个单独的参考表,表明这些数据源的优先级。
有没有人有最好的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的数据。因此,删除需要基于每个唯一项目进行。
答案 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;
罗布