У меня есть таблица, которая связывает пользователей. Рассмотрим следующее:
**Table contracts:**
contract_id int,
contract_number varchar,
user_id int
**Table users:**
user_id int
**Table user_links**
user_id int,
linked_user_id int
В таблице user_links может быть 0 строк для конкретного user_id, если у пользователя нет связанных пользователей, поэтому оператор select может возвращать либо строку, либо NULL.
Подход с
left join user_links ul on ul.user_id = contracts.user_id OR ul.linked_user_id = contracts.user_id
не работает, если в таблице user_links нет строки.
Учитывая только int user_id, как я могу получить строки из таблицы контрактов как для user_id, так и для linked_user_id? Например, если у user_id 1 есть linked_user_id 2, мне нужны строки из контрактов для обоих пользователей; однако, если у пользователя нет строки в таблице user_links, мне все равно нужно получить их контракты.
Предполагая, что ваш входной user_id является переменной @user_id, тогда приведенный ниже запрос предоставит вам все контракты этого пользователя и, если какой-либо связанный пользователь.
SELECT * from contracts c
where c.user_id = @user_id
OR c.user_id IN ( SELECT linked_user_id from user_links ul
WHERE ul.user_id = @user_id)
Хорошо, вы можете принять ответ. Вы также можете добавить индекс в столбец user_id.
Все согласны с тем, что, несмотря на то, что индекс может оказаться полезным, сама схема базы данных, вероятно, должна оставаться нетронутой, поскольку нам уже несколько раз приходилось выполнять ПОЛНУЮ ВАКУУМИЗАЦИЯ, чтобы индексы полностью не превратились в пыль. Это большая база данных под массивным монолитным сервисом, и она скоро выйдет из строя.
Спасибо! Однако я предлагаю небольшое редактирование, после которого все заработало безупречно. Я забыл проверить индексы в таблице, и оказалось, что первичный ключ в таблице user_links был linked_user_id, а user_id был обычным столбцом. Если кто-то страдает от подобной неприятности, я сделал
c.user_id = any(array(SELECT linked_user_id from user_links where user_id= @user_id));