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

4

1 回答 1

1

你不能,真的。第一个表的独特之处在于没有任何冗余,而第二个表具有相同“三元组”的多个条目。想到的第一个想法是在 2 个表的 UNION 上执行自联接,尽管效率低下,但这将满足您的需求。

如果这种方式工作得很好,那么了解为什么您需要能够以两种方式做到这一点可能会有所帮助。

于 2013-10-30T13:44:04.607 回答