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) を 1 回だけリストする必要があり、ABS(t1.POSITION - t2.POSITION) が最小である必要があります。

GROUP BY を使用して、これを 1 つの方法で行う方法を見つけました。

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 番目のテーブルには同じ「スリーグラム」に対する複数のエントリがあります。頭に浮かぶ最初のアイデアは、2 つのテーブルの UNION で自己結合を実行することです。これは、非効率的ではありますが、必要なことを実行します。

この方法が完全にうまく機能する場合、なぜこれを両方の方法で実行できるようにする必要があるかを知っておくと役立つ場合があります。

于 2013-10-30T13:44:04.607 に答える