2012-03-18 5 views
1

궁금 가입 변환하는 자체 하위 쿼리다음은 가입 자체에 자체 하위 쿼리를 변환 할 수있는 방법이 있다면 자체에 자체 하위 쿼리

SELECT a, 
     b 
FROM c AS t1 
WHERE (b IN (SELECT b 
       FROM c AS t2 
       WHERE (t1.b = b) 
         AND (t1.e <> e))) 
+0

하위 쿼리가 수행중인 작업은 무엇입니까? 그것은 당신이 그것을 없애 버릴 수있는 것 같습니다 ... – jle

+0

그것은 테이블의 무언가가 같은 값을 가지고 있는지 확인합니다 –

+0

그리고 e는 일들을 구별하는데 사용되는 기본 키입니다 –

답변

4

에게 있습니다 EXIST 아마 더 빠를 것이다 중복 찾으려면 :

SELECT a,b FROM c WHERE EXISTS(SELECT NULL FROM c c2 WHERE c2.b=c.b AND c2.e<>c.e) 

당신이 가진 모든 레코드에 가입하려면 그것의 중복하지만 각각에 대해 하나의 레코드 만 얻을 :

select t1.a 
,  t1.b 
,  t1.e as t1e 
,  t2.e as t2e 
from c as t1 
inner join c as t2 
on  t1.b = t2.b 
     and t1.e > t2.e 

e으로

+0

'IN'과'EXISTS'는 아마 같은 계획을 줄 것입니다. –

1
SELECT t1.a, t2.b 
FROM c as t1 
join c as t2 on t1.b=t2.b 
WHERE t1.e <> t2.e 
1
select t1.a 
,  t1.b 
from c as t1 
join c as t2 
on  t1.b = t2.b 
     and t1.e <> t2.e 
2

는 것이 접근의 또 다른 방법은 기본 키입니다 (내가 > 대신 <>의 사용했습니다 참고)를

SELECT a, 
     b 
FROM (SELECT a, 
       b, 
       COUNT(*) OVER (PARTITION BY b) AS Cnt 
     FROM c) T1 
WHERE Cnt > 1 
관련 문제