每个表中只加一行,反之亦然

时间:2013-10-30 13:35:20

标签: sql join

有很多类似的问题,似乎并不能涵盖我想要的内容。

我有两张桌子:

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

1 个答案:

答案 0 :(得分:1)

你不能,真的。第一个表是唯一的,因为没有任何冗余,而第二个表有相同'threegram'的多个条目。想到的第一个想法是在2个表的UNION上执行自联接,这将尽你所能地执行所需的操作。

知道为什么你需要能够以这两种方式做到这一点可能会有所帮助,如果这种方式完全正常的话。