Как получить данные из двух таблиц на основе уникальных критериев. Я чувствую, что это не правильное решение - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть 2 таблицы: одна - Пользователь, а другая - TreatmentStatusTable. Пользовательские таблицы имеют 2 типа пользователей: сначала «доктор», а другой - «пациент». Врач может лечить пациента, и его состояние заносится в таблицу TreatmentStatusTable.

Каждый раз, когда врач осматривает пациента, он отмечается. В следующем запросе я хочу видеть только тех пациентов, которых врач пока не посещал. Как мне добиться этого эффективно?

Вот мой сценарий:

Пользователь

id
name 
dateObirth
userType- doctor/patient 

TreatmentStatusTable

treated_by- User.id (UserId of doctor)
treated_to User.id (UserId of patient)
treatment_status  cured/referd

Теперь я хочу найти все остальные пациенты в таблице пользователей, где врач НЕ имеет возможности увидеть пациента

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

Select * 
from User 
where user.id not in (
                        Select User.id 
                        from TreatmentStatusTable 
                        where treated_by= User.id).   <- this the doctor's user.id

, поэтому в основном нужно получить всех пользователей из таблицы. Пользователь, которого доктор еще не видел.

У меня работает приведенный выше запрос. Но я полагаю, что как только размер результата более позднего запроса (2-го запроса) составит несколько тысяч, этот запрос не будет выполнен

Может кто-нибудь предложить мне более эффективный способ запроса этих данных более эффективным способом?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2020

Я думаю, что вы хотите not exists. Примерно так:

select u.*
from users u
where u.user_type = 'patient' and
      not exists (select 1 
                  from treatmentstatustable tst
                  where tst.treated_to = u.id
                 );

Для производительности вам нужен индекс на treatmentstatustable(treated_to). Производительность должна быть хорошей для десятков тысяч строк (и более).

1 голос
/ 14 апреля 2020

Я не знаю, почему вы думаете, что объединение не является правильным решением.

Я бы написал так:

Select u.* 
from User AS u
left outer join TreatmentStatusTable AS t 
  on u.id = t.treated_to
where t.treated_to is null

Внешнее объединение возвращает NULL для столбцов в t, если для данного пользователя нет подходящей строки. Если мы используем условие where, чтобы ограничить результаты только теми случаями, когда t имеет значения NULL, то это должен быть пользователь, которого врач не видел.

Это обычный способ написания "исключающее соединение", чтобы найти строки без совпадений.

...