2009-07-31 231 views
2

我有一組包含重複條目,因爲從數據源倍數起源行的重複數據刪除列表。我還有一個單獨的參考表,指出這些數據源的優先級。提示基於優先級列

沒有人有最有效的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

回答

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將有一個範圍的子查詢或不是,但。

+0

它確實在這一點上的範圍 - 你能向我解釋這個嵌套select是如何加入以正確地獲得正確的優先權嗎? – jkelley 2009-07-31 18:04:52

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; 

羅布