2013-04-16 2 views
0

스택이라고하는 테이블이 있다고 가정합니다.십자가가 사용 된 ID를 찾는 방법

Id  StackId 
------------------- 
.    . 
1    10 
2    12 
3    10 
4    10 
5    11 
11   5 
.    . 
.    . 

같은 ID를 배우는 방법은?

Id = 5 
StackId = 11 

Id = 11 
StackId = 5 

내가되는 SQL 문장을 쓸 수 없습니다 내가 테이블 1.000.000+ 행을 가지고 있기 때문에 숫자를 잘 모릅니다, 그래서 5,11을 좋아하는 행을 찾으려면

5,11 
11,5 

저를 보여줍니다

+0

결과를 정확히 표시 하시겠습니까? 첫 번째 샘플 또는 두 번째 샘플? – Freelancer

+0

당신은 정말로'SELECT id, stackid FROM stack'을 찾고 있지 않습니까? –

+0

'select id, stack id from (5,11)'id는 (두 번째) 결과를 줄 것입니다 – agim

답변

1

. 여기에 한 가지 방법이다 : 당신이 least()greatest() 기능을 가진 데이터베이스가있는 경우

select (case when id < StackId then id else StackId end) as FirstVal, 
     (case when id < StackId then StackId else id end) as SecondVal 
from t 
group by (case when id < StackId then id else StackId end), 
     (case when id < StackId then StackId else id end) 
having count(distinct id) = 2 

, 당신은 이제 테이블에 중복이 알고, 당신은이를 바꿔 수 있습니다

select least(id, StackId) as FirstVal, greatest(id, StackId) as SecondVal 
from t 
group by least(id, StackId), greatest(id, StackId) 
having count(*) = 2 
3

s1.Id = s2.StackId AND s1.StackId = s2.Id 조건 테이블 자체에 사용 JOIN :

SELECT s1.Id, s1.StackId 
FROM Stack s1 
JOIN Stack s2 ON s1.Id = s2.StackId AND s1.StackId = s2.Id 

INNER JOIN이 사용되었으므로 (기본적으로) 대응하는 s2 값이없는 행은 반환되지 않습니다.

1

시도하십시오 : 당신은 집계와이 접근뿐만 아니라 가입하실 수 있습니다

select a.* from 
    YourTable a inner join YourTable b on a.Id=b.StackId 
1

또 다른 해결책을 :

select * 
from Stack s 
where exists (select 1 from Stack where Id = s.StackId and StackId = s.Id) 
관련 문제