提示基于优先级列
问题描述:
我有一组包含重复条目,因为从数据源倍数起源行的重复数据删除列表。我还有一个单独的参考表,指出这些数据源的优先级。提示基于优先级列
没有人有最有效的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具有它因此,删除需要每个唯一的项目的基础上发生。
答
我想你可以做这样的事情:
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将有一个范围的子查询或不是,但。
+0
它确实在这一点上的范围 - 你能向我解释这个嵌套select是如何加入以正确地获得正确的优先权吗? – jkelley 2009-07-31 18:04:52
答
尝试使用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;
罗布
1)当你说你有重复的条目,在表A相同的所有列两行是重复的?如果他们不是,并且tableA.SourceId不同,并且您在tableB中只有一个匹配的源代码ID,并且您想要删除重复项,那么只需在tableA上运行删除而不是临时表。 – 2009-07-31 03:15:30