Ein Richtungs: ID_1 ein Name ist, ist ID_2 ein Synonym:
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
Zwei Richtungs: entweder ID_1 oder ID_2 können einen Namen enthalten, während der andere das Synonym ist.
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
Hinweis ID_2 und ID_1 werden im zweiten Teil der zweiten Abfrage umgekehrt.
Welches Sie benötigen, hängt von den Daten ab. Wenn "Spur" ein Synonym für "Straße" sein soll, aber nicht umgekehrt, sollten Sie die erste Methode verwenden. Aber in diesem Fall werden Sie müssen bedenken, dass Synonyme in beiden Richtungen zweimal hinzugefügt werden sollte, so dass Sie erhalten:
NAMES_TABLE SYNONYMS_TABLE
------------ --------------
ID | NAME ID_1 | ID_2
---+-------- ------+-------
1 | Road 1 | 3
2 | Lane 3 | 1
3 | Street 2 | 1
Jetzt Straße und Straße sind jeweils andere Synonyme, aber während Lane ist ein Synonym für Straßen Straße ist nicht für Lane. Wenn Sie dieses Verhalten nicht möchten, verwenden Sie besser das zweite, obwohl Sie riskieren können, doppelte Datensätze einzugeben, indem Sie ID_1 und ID_2 austauschen. Sie sollten dies verhindern können, indem Sie überprüfen, ob ID_2 immer höher als ID_1 ist, niemals gleich oder niedriger.
Es ist genau das, was ich brauchte. Danke für die Anfragen und die klaren zusätzlichen Erklärungen. – mlh