Das ist etwas kompliziert, aber ich habe 2 Tische. Nehmen wir an, die Struktur sieht ungefähr so aus:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
Die Tabellen können basierend auf Table1.PhoneNumber1 -> Table2.PhoneNumber oder Table1.PhoneNumber2 -> Table2.PhoneNumber verknüpft werden.
Jetzt möchte ich eine Ergebnismenge erhalten, die PhoneNumber1, SomeOtherField, das PhoneNumber1, PhoneNumber2 entspricht, und SomeOtherField, das PhoneNumber2 entspricht, enthält.
Ich habe mir zwei Möglichkeiten ausgedacht, dies zu tun - entweder durch zweimaliges Verbinden auf dem Tisch oder durch einmaliges Verbinden mit einem ODER in der ON-Klausel.
Methode 1 :
SELECT t1.PhoneNumber1, t1.PhoneNumber2,
t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
ON t3.PhoneNumber = t1.PhoneNumber2
Das scheint zu funktionieren.
Methode 2 :
Irgendwie eine Abfrage zu haben, die ein bisschen so aussieht -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
Ich habe das noch nicht zum Laufen gebracht und bin mir nicht sicher, ob es einen Weg gibt, es zu tun.
Was ist der beste Weg, um dies zu erreichen? Keiner der Wege scheint einfach oder intuitiv zu sein ... Gibt es einen einfacheren Weg, dies zu tun? Wie wird diese Anforderung allgemein umgesetzt?
Das erste ist gut, es sei denn, entweder Telefon1 oder (wahrscheinlicher) Telefon2 kann null sein. In diesem Fall möchten Sie einen linken Join anstelle eines inneren Joins verwenden.
Es ist normalerweise ein schlechtes Zeichen, wenn Sie eine Tabelle mit zwei Telefonnummernfeldern haben. Normalerweise bedeutet dies, dass Ihr Datenbankdesign fehlerhaft ist.
quelle
Sie können
UNION
zwei Verknüpfungen kombinieren:quelle
Mein Problem bestand darin , den Datensatz auch dann anzuzeigen, wenn keine oder nur eine Telefonnummer vorhanden ist (vollständiges Adressbuch). Deshalb habe ich einen LEFT JOIN verwendet, der alle Datensätze von links nimmt, auch wenn rechts kein entsprechender vorhanden ist. Für mich funktioniert dies in Microsoft Access SQL (sie erfordern die Klammer!)
quelle
Die erste Methode ist der richtige Ansatz und wird das tun, was Sie brauchen. Bei den inneren Verknüpfungen wählen Sie jedoch nur dann Zeilen aus,
Table1
wenn beide Telefonnummern in vorhanden sindTable2
. Möglicherweise möchten Sie dies tun,LEFT JOIN
damit alle Zeilen ausTable1
ausgewählt werden. Wenn die Telefonnummern nicht übereinstimmen, ist dasSomeOtherField
s null. Wenn Sie sicherstellen möchten, dass Sie mindestens eine passende Telefonnummer haben, können Sie dies tunWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL
Die zweite Methode könnte ein Problem haben: Was passiert, wenn
Table2
beidePhoneNumber1
undPhoneNumber2
? Welche Zeile wird ausgewählt? Abhängig von Ihren Daten, Fremdschlüsseln usw. kann dies ein Problem sein oder auch nicht.quelle