2009-07-31 5 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) 당신은 당신이, 중복 된 항목이 TableA의 동일한에게 모든 열 말할 때 중복되는 두 개의 행에 대해? 그렇지 않으면 tableA.SourceId가 다르며 tableB에 일치하는 소스 ID가 하나 뿐이며 중복을 삭제하려는 경우 임시 테이블 대신 tableA에서 삭제를 실행하십시오. –

답변

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

그 시점에 범위가 있습니다 - 중첩 된 선택이 올바른 우선 순위를 올바르게 얻는 방법에 대해 설명해 주시겠습니까? – jkelley

+1

물론이 쿼리는 tableA의 모든 행에 대해 실행되므로 결과는 실행되는 행의 sourceId에 대해 가장 높습니다. 그것은 반환되는 모든 행에서 함수를 실행하는 것과 같습니다. – Jon

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;