一つの方向性は:ID_1は名前で、ID_2は同義語です:
select
sn.NAME
from
NAMES_TABLE n
inner join SYNONYMS_TABLE s on s.ID_1 = n.ID
inner join NAMES_TABLE sn on sn.ID2 = s.ID_2
where
n.NAME = :NAME
二つの方向性:他のはその同義語である一方、ID_1またはID_2いずれかが、名前を含めることができます。
select
sn1.NAME
from
NAMES_TABLE n1
inner join SYNONYMS_TABLE s1 on s1.ID_1 = n1.ID
inner join NAMES_TABLE sn1 on sn1.ID = s1.ID_2
where
n1.NAME = :NAME
union
select
sn2.NAME
from
NAMES_TABLE n2
inner join SYNONYMS_TABLE s2 on s2.ID_2 = n2.ID
inner join NAMES_TABLE sn2 on sn2.ID = s2.ID_1
where
n2.NAME = :NAME
注意ID_2とID_1は、2番目のクエリの2番目の部分で反転しています。
必要なデータはデータによって異なります。 「車線」を「道路」の同義語にしたいが、それ以外の方法ではない場合は、最初の方法を使用する必要があります。しかし、その場合には、あなたは両方向の同義語を二回追加しなければならないことを覚えておく必要がありますので、あなたが買ってあげる:
NAMES_TABLE SYNONYMS_TABLE
------------ --------------
ID | NAME ID_1 | ID_2
---+-------- ------+-------
1 | Road 1 | 3
2 | Lane 3 | 1
3 | Street 2 | 1
今の道と街はお互いの同義語ですが、レーンながら道路の同義語です、道路は車線用ではありません。 ID_1とID_2を入れ替えることで二重レコードを入力する危険性がありますが、その動作をしたくない場合は、二番目の行を使用することをお勧めします。 ID_2が常にID_1よりも高く、決して同じでも低くてもないことを確認することで、これを防ぐことができます。
これは私が必要としていたものです。リクエストと明確な追加説明に感謝します。 – mlh