Оператор SQL SELECT с дополнительной таблицей «многие ко многим»

У меня есть таблица, которая связывает пользователей. Рассмотрим следующее:

**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, мне все равно нужно получить их контракты.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что ваш входной 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_links был linked_user_id, а user_id был обычным столбцом. Если кто-то страдает от подобной неприятности, я сделал c.user_id = any(array(SELECT linked_user_id from user_links where user_id= @user_id));

Stanislav Levchenko 10.01.2023 18:50

Хорошо, вы можете принять ответ. Вы также можете добавить индекс в столбец user_id.

Anand Sowmithiran 11.01.2023 04:51

Все согласны с тем, что, несмотря на то, что индекс может оказаться полезным, сама схема базы данных, вероятно, должна оставаться нетронутой, поскольку нам уже несколько раз приходилось выполнять ПОЛНУЮ ВАКУУМИЗАЦИЯ, чтобы индексы полностью не превратились в пыль. Это большая база данных под массивным монолитным сервисом, и она скоро выйдет из строя.

Stanislav Levchenko 11.01.2023 06:43

Другие вопросы по теме