提示基于优先级列

问题描述:

我有一组包含重复条目,因为从数据源倍数起源行的重复数据删除列表。我还有一个单独的参考表,指出这些数据源的优先级。提示基于优先级列

没有人有最有效的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)当你说你有重复的条目,在表A相同的所有列两行是重复的?如果他们不是,并且tableA.SourceId不同,并且您在tableB中只有一个匹配的源代码ID,并且您想要删除重复项,那么只需在tableA上运行删除而不是临时表。 – 2009-07-31 03:15:30

我想你可以做这样的事情:

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; 

罗布