2013-04-16 22 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語句,顯示我

5,11 
11,5 

我不知道這些數字,因爲該表具有1.000.000+行,所以我想找到它喜歡5,11行

+0

如何顯示結果?第一個樣品或第二個樣品? – Freelancer

+0

你並不是真的在尋找'SELECT id,stackid FROM stack',對嗎? –

+0

'select id,stackId from stack where id in(5,11)'' would give you second second(last)result – agim

回答

1

您可以通過聚合方式這個問題,以及爲連接。這裏有一個方法:

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 

如果你有一個least()greatest()功能的數據庫,你知道現在有複製的表,你可以改寫這個:

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

使用JOIN表本身s1.Id = s2.StackId AND s1.StackId = s2.Id條件:

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)