Это немного сложно, но у меня есть 2 таблицы. Допустим, структура выглядит примерно так:
*Table1*
ID
PhoneNumber1
PhoneNumber2
*Table2*
PhoneNumber
SomeOtherField
Таблицы можно объединять на основе Table1.PhoneNumber1 -> Table2.PhoneNumber или Table1.PhoneNumber2 -> Table2.PhoneNumber.
Теперь я хочу получить набор результатов, содержащий PhoneNumber1, SomeOtherField, который соответствует PhoneNumber1, PhoneNumber2 и SomeOtherField, который соответствует PhoneNumber2.
Я подумал о двух способах сделать это - либо дважды присоединиться к таблице, либо один раз присоединиться с помощью OR в предложении ON.
Способ 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
Кажется, это работает.
Способ 2 :
Чтобы каким-то образом получить запрос, который выглядит примерно так -
SELECT ...
FROM Table1
INNER JOIN Table2
ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
Table1.PhoneNumber2 = Table2.PhoneNumber
У меня это еще не работает, и я не уверен, есть ли способ сделать это.
Как лучше всего этого добиться? Ни один из способов не кажется простым или интуитивно понятным ... Есть ли более простой способ сделать это? Как обычно выполняется это требование?
Первый хорош, если только Phone1 или (что более вероятно) phone2 не могут иметь значение null. В этом случае вы хотите использовать левое соединение вместо внутреннего соединения.
Когда у вас есть таблица с двумя полями телефонных номеров, это обычно плохой знак. Обычно это означает, что ваша база данных ошибочна.
источник
Вы можете использовать
UNION
для объединения двух соединений:источник
Моя проблема заключалась в том, чтобы отобразить запись, даже если номер телефона отсутствует или существует только один (полная адресная книга). Поэтому я использовал LEFT JOIN, который берет все записи слева, даже если справа нет соответствующего. Для меня это работает в Microsoft Access SQL (они требуют скобки!)
источник
Первый метод - это правильный подход, и он сделает то, что вам нужно. Однако с внутренними объединениями вы будете выбирать строки только в том
Table1
случае, если оба телефонных номера существуют вTable2
. Вы можете сделатьLEFT JOIN
так, чтобыTable1
были выбраны все строки из . Если номера телефонов не совпадают,SomeOtherField
s будет нулевым. Если вы хотите убедиться, что у вас есть хотя бы один подходящий номер телефона, вы можете сделатьWHERE t2.PhoneNumber IS NOT NULL OR t3.PhoneNumber IS NOT NULL
У второго метода может быть проблема: что произойдет, если
Table2
есть иPhoneNumber1
иPhoneNumber2
? Какая строка будет выбрана? В зависимости от ваших данных, внешних ключей и т. Д. Это может быть или не быть проблемой.источник