2013-10-30 28 views
1

有很多類似的問題,這似乎並不能涵蓋我想要的。每個表只加入一行,反之亦然

我有2個表:

THREEGRAM POSITION 
^^B  1 
^BA  2 
BAK  3 
AKA  4 
KAC  5 
ACE  6 
CEV  7 
EVA  8 
VA$  9 
A$$  10 

THREEGRAM POSITION 
^^S  1 
^SO  2 
SOR  3 
ORK  4 
RKO  5 
KOC  6 
OCE  7 
CEV  8 
EVI  9 
VIC  10 
ICE  11 
CEV  12 
EVA  13 
VA$  14 
A$$  15 

我可以加入這些表有以下結果:

select * from t1 
join t2 on t1.threegram = t2.threegram 

THREEGRAM POSITION THREEGRAM POSITION 
CEV  7  CEV  8 
CEV  7  CEV  12 
EVA  8  EVA  13 
VA$  9  VA$  14 
A$$  10  A$$  15 

這不是我期待的結果對於;我只希望POSITION(t1和t2)列出一次,它應該是ABS(t1.POSITION - t2.POSITION)最小的那個。

我想通了如何使用GROUP BY做到這一點的一種方法:

select t1.threegram, t1.POSITION, min(abs(t1.position-t2.position)) as MinPosition 
from t1  
join t2 on t1.threegram = t2.threegram 
group by t1.threegram, t1.POSITION 
order by t1.POSITION 

THREEGRAM POSITION MinPosition 
CEV  7  1 
EVA  8  5 
VA$  9  5 
A$$  10  5 

的問題是,我想這是雙向的,一個解決方案,即當我切換T1和T2在上面的查詢,結果應該是相似的並返回4行。

+0

當你交換t1和t2時,你看到了什麼結果? – PinnyM

回答

1

你不能,真的。第一個表格是獨一無二的,因爲沒有任何冗餘,而第二個表格對於相同的「三克」具有多個條目。想到的第一個想法是在2個表的UNION上執行自我連接,這將完成你所需要的,儘管效率低下。

如果知道爲什麼你需要能夠做到這一點,這兩種方式可能會有幫助,如果這種方式完美地工作。