有很多类似的问题,似乎并不能涵盖我想要的内容。
我有两张桌子:
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 :(得分:1)
你不能,真的。第一个表是唯一的,因为没有任何冗余,而第二个表有相同'threegram'的多个条目。想到的第一个想法是在2个表的UNION上执行自联接,这将尽你所能地执行所需的操作。
知道为什么你需要能够以这两种方式做到这一点可能会有所帮助,如果这种方式完全正常的话。