Фильтрация соединений с двумя внешними ключами - PullRequest
0 голосов
/ 17 марта 2020

Скажем, у меня есть две таблицы, users и addresses (содержит столбцы id и text). У меня есть два адресных столбца в users, скажем temp_address_id и permanent_address_id.

Если я хочу получить добавление пользователей с помощью temp_address = 'SF' или constant_address = 'MTV ', является ли следующий запрос единственным выходом?

SELECT * FROM users
JOIN addresses ON (
  (users.temp_address_id = addresses.id AND addresses.text = 'SF')
  OR (users.permanent_address_id = addresses.id AND addresses.text = 'MTV')
)

Я не думаю, что есть способ указать фильтры (addresses.text = 'SF' и addresses.text = 'MTV') в предложении WHERE. Это верно?

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Если вам нужны только пользователи, я бы порекомендовал два exists:

SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1
              FROM addresses a
              WHERE u.temp_address_id = a.id AND a.text = 'SF'
             ) OR
      EXISTS (SELECT 1
              FROM addresses a
              WHERE u.permanent_address_id = a.id AND a.text = 'MTV'
             );

Это должно иметь гораздо лучшую производительность, чем OR в предложении JOIN, особенно с индексом на addresses(id, text).

Если вам требуется вернуть информацию об адресе, используйте два left join s:

SELECT u.*, COALECE(ta.text, tp.text) as text
FROM users u LEFT JOIN
     addresses ta
     ON u.temp_address_id = ta.id AND
        ta.text = 'SF' LEFT JOIN
     addresses tp
     ON u.permanent_address_id = ta.id AND
        ta.text = 'MTV'
WHERE ta.id IS NOT NULL OR tp.id IS NOT NULL;

Недостатком этого подхода является то, что вам необходимо использовать COALESCE() для каждого из столбцы, выбранные из таблицы address.

0 голосов
/ 17 марта 2020

Редактировать: Изменено условие соединения, чтобы включить оба адреса.

Почему вы не можете выполнять следующие действия? Вы пробовали это?

SELECT u.*,COALESCE(a.text,b.text) AS text
FROM users u
LEFT JOIN addresses a ON u.temp_address_id = a.id AND a.text = 'SF'
LEFT JOIN addresses b ON u.permanent_address_id = b.id AND b.text = 'MTV';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...