2014-11-19 4 views
0

문제가 큰 쿼리를 가입 : 나는 쿼리 의 결과에서 중복 쌍을 제거해야내부가 자체

(설명 here 같은 문제를)

결과 (A가 있습니다 그렇다면

, B), (B, A)는 (C, A)는

나는 (A, B)와 (C, A)

합병증에만 관심이 : 링크 된 질문과 달리 자체 조인을 수행하고 쉽게 검색 할 수있는 데이터를 테이블에서 사용할 수 없습니다.

SELECT T.C1, T.C2 
((SELECT C1, C2 from a mind boggling number of joins and unions)) T1 

을 다음과 같이

(SELECT C1, C2 from a mind boggling number of joins and unions) 

그래서 내가

위에서 언급 한 바와 같이 내부 중복 쌍을 제거하기 위해 가입을 수행하고 싶은 그것을 임시 테이블을 만들 수있는 다음과 같은 상태에서 더 그런 시나리오에서 그렇게 할 방법이 있습니까? 아래의 쿼리는 구문 적으로 잘못되었지만 잘하면이 아이디어를 전달합니다.

SELECT A.C1, A.C2 
((SELECT C1, C2 from a mind boggling number of joins and unions)) T1 A 
INNER JOIN T1 B 
ON A.C1 = B.C1 AND 
A.C2 < B.C2 

내가 여기 당신이뿐만 아니라 결과를 저장하고 혼자 cte1 사용하는 임시 테이블을 사용할 수 있습니다 CTE를

으로 원하는 것을 달성하기위한 하나의 방법은 SQL 서버 2012

+1

구문에 따라 공통 테이블 식 (WITH)을 사용할 수 있지만 임시 테이블을 사용하면 성능이 향상 될 수 있습니다. – okaram

답변

1

을 실행하고 있습니다.

with cte 
as 
( 
    select col1, col2 from --- your query here. 

) 
, cte1 
as 
(
    select col1, col2, row_number() over 
     (partition by (case when col1 >= col2 then col1 
          else col2 
          end) , 
         (case when col1 <= col2 then col1 
          else col2 
         end) order by (select null) 
     ) as rn 
    from cte 
) 
select * from cte1 where rn =1 
+0

매력처럼 작동합니다. 나는 CTE에 대해 몰랐다. 파티션도 멋진 도구입니다. 임시 테이블을 사용하지 않고 성능을 체크합니다. – iluvcornflakes