параметры для возврата различных значений через внутреннее соединение

У меня есть две таблицы.

Таблица A содержит UserID, UserName

Таблица B содержит ID, FK_UserID, ClientName

Мне нужно вернуть список отдельных A.UserName, где A.Username существует в таблице B и к ним прикреплено хотя бы одно ClientName, но в моем запросе посмотрите только на отдельный B.ClientName.

Мои мысли были:

Select Distinct A.UserName from A as A
Inner Join B as B
on A.UserID = B.FK_UserID

Но это различается только в таблице A

Следующей моей мыслью было:

Select Distinct Username from A
where UserID In 
(
Select FK_UserID, distinct ClientName from B)

Мне сказали, что есть способ сделать разные таблицы в объединении, потому что, если таблица A состоит из 300 строк, а таблица B — из 3 миллиардов строк, мой первоначальный запрос займет некоторое время.

Этот человек специально хочет, чтобы я использовал внутреннее соединение...


person Michael Harness    schedule 24.04.2014    source источник
comment
Что вы имеете в виду в моем запросе, посмотрите только на distict B.ClientName? Вы не возвращаете ClientName в результатах, не так ли? Что это значит в таком случае?   -  person Jason Goemaat    schedule 24.04.2014


Ответы (1)


Ваш исходный запрос:

Select Distinct A.UserName
from A as A Inner Join
     B as B
     on A.UserID = B.FK_UserID;

Это может быть проблемой, если в b много совпадений. Использование in не совсем правильное решение. Вместо этого используйте exists:

select a.UserName
from a
where exists (select 1
              from b
              where b.fk_UserID = a.UserId
             )

Затем убедитесь, что у вас есть индекс на b(fk_UserId).

Это должно сделать около 300 поисковых запросов в индексе. Это должно быть довольно быстро.

Мой совет тому, кто сказал вам использовать внутреннее соединение: напишите специальную версию для этого человека. В течение многих минут или часов, которые требуются для запуска, пусть другие люди используют более быструю версию, используя exists.

person Gordon Linoff    schedule 24.04.2014
comment
Это еще один способ, но как насчет использования внутреннего соединения? Это то, о чем они просят, и я должен выяснить, как... - person Michael Harness; 24.04.2014
comment
@МайклХарнесс. . . Если каждый идентификатор в таблице a имеет много совпадений в таблице b, то внутреннее соединение действительно может занять много времени. Почему кто-то говорит вам, как писать запросы (и почему они кажутся неправильными)? - person Gordon Linoff; 24.04.2014
comment
Я не знаю, то ли они просто проверяют меня, то ли это то, чего они действительно хотят. Это был вопрос, заданный мне сегодня на работе моим начальником, и я не смог найти ничего, относящегося к нему в Интернете. На самом деле у меня есть второй несвязанный вопрос, который я задам вскоре после того, как проведу исследование от того же человека. - person Michael Harness; 25.04.2014
comment
@МайклХарнесс. . . Для join подходит тот же индекс для b и несколько (до десятков) совпадений для каждого идентификатора в a. Если у вас их много (тысячи и более), то на обработку distinct будет потрачено много дополнительного времени. Вот почему exists лучше. - person Gordon Linoff; 25.04.2014