簡體   English   中英

在每個表中僅連接一行,反之亦然

[英]Join only one row in each table and vice versa

有很多類似的問題,似乎並不能滿足我的要求。

我有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行。

你不能,真的。 第一個表是唯一的,因為它沒有任何冗余,而第二個表具有相同“ threegram”的多個條目。 我想到的第一個想法是對2個表的UNION執行自聯接,這將有效地完成您所需的工作。

如果這種方法可以很好地工作,那么知道為什么需要同時使用這兩種方法可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM